Thread Windows: Perl-Modul einer DLL mit XS (8 answers)
Opened by Gast at 2008-05-24 01:58

murphy
 2008-05-24 21:34
#110242 #110242
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
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--
[...]
DEFINE => '-DBUILD_DLL', # e.g., '-DHAVE_SOMETHING'
[...]


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.

View full thread Windows: Perl-Modul einer DLL mit XS