Thread Windows: Perl-Modul einer DLL mit XS
(8 answers)
Opened by Gast at 2008-05-24 01:58
Mir ist gerade noch aufgefallen, dass auch diese Zeile beim Bauen Deines XS-Codes vermutlich Käse ist:
Gast+2008-05-23 23:58:08-- Wegen [cpp] #ifdef BUILD_DLL /* DLL export */ #define EXPORT __declspec(dllexport) [...] [/cpp] führt sie nämlich dazu, dass add_dll genau die falschen Linkageattribute bekommt. Beim Bauen der DLL selbst hingegen, sollte dieses Präprozessormakro auf jeden Fall definiert sein. Ausserdem würde ich sicherheitshabler noch C-Linkage für die Funktion add_dll angeben, falls man den Header mal durch einen C++Compiler jagt. Und man sollte Praeprozessormakros wie das BUILD_DLL tunlichst nicht so generisch benennen, weil sich sonst mehrere Bibliotheksheader ganz schnell in die Quere kommen können. Also besser so, das ist auch gleich portabler: [cpp] /** * @file hallo.h */ #ifndef _HALLO_H_ #define _HALLO_H_ #ifdef HALLO_SHARED_LIB # ifdef _HALLO_EXPORTS_ # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # define HALLO_EXPORT __declspec(dllexport) # else # define HALLO_EXPORT # endif # else # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # define HALLO_EXPORT __declspec(dllimport) # else # define HALLO_EXPORT # endif # endif /* _HALLO_EXPORTS_ */ #else # define HALLO_EXPORT #endif /* HALLO_SHARED_LIB */ #ifdef __cplusplus extern "C" { #endif HALLO_EXPORT int hallo_add(int a, int b); #ifdef __cplusplus } #endif #endif /* _HALLO_H_ */ [/cpp] und [cpp] /** * @file hallo.c */ #define _HALLO_EXPORTS_ #include "hallo.h" int hallo_add(int a, int b) { return a + b; } [/cpp] Compilerkommando zum Bau der DLL: Code: (dl
)
gcc -Wall -O2 -DHALLO_SHARED_LIB -fPIC -shared hallo.c -o hallo.dll -Wl,--out-implib=libhallo.a Testprogramm: [cpp] /** * @file test.c */ #include <stdlib.h> #include <stdio.h> #include "hallo.h" int main(int nargs, char **args) { const int a = 1, b = 2; printf("hallo_add(%d, %d) = %d\n", a, b, hallo_add(a, b)); return EXIT_SUCCESS; } [/cpp] Compilerkommando zum Benutzen der DLL: Code: (dl
)
gcc -Wall -O2 -DHALLO_SHARED_LIB test.c -o test.exe -L. -lhallo Warnhinweis: Ich habe kein MinGW zum Testen zur Hand. Die Compilerkommandos sind vielleicht nicht völlig korrekt. When C++ is your hammer, every problem looks like your thumb.
|