MinGW MSVC-DLL Import

Hallo,

ich habe folgende DLL in VB C++ 6.0 kompiliert:

 #ifndef DLL1\_H
#define DLL1\_H

\_\_declspec(dllexport) int test();

#endif 




#include "DLL1.h"

int test()
{
 return 3;
}

und danach in folgendes c programm eingebunden:

\_\_declspec(dllimport) int test();

int main () {
 test();
 return 0;
}

Das kompilieren mit g++ funktionierte ohne fehler. Beim linken mit

g++ -L. -o"testdll.exe" ./test.o -ldll

jedoch, erhalte ich immer folgende fehlermeldung:

…/test.cpp:4: undefined reference to `_imp___Z4testv’

MinGW ist gerade erst installiert und sollte deshalb aktuell sein.

Laut dieser Anleitung(http://www.mingw.org/mingwfaq.shtml#faq-msvcdll) sollte es so funktionieren. Hat jemand eine Ahnung warum es das nicht tut?

Danke, Torsten

Hast du in der main die header datei wirklich nicht eingebunden? Hast du dem linker die richtigen parameter übergeben? Kenne mich leider nicht mit dem tool aus. Aber auch dir würde ich zu der kostenlosen MS VS Cpp expressversion raten :smile:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

ich habe folgende DLL in VB C++ 6.0 kompiliert:

#ifndef DLL1_H
#define DLL1_H

__declspec(dllexport) int test();

#endif

#include „DLL1.h“

int test()
{
return 3;
}

und danach in folgendes c programm eingebunden:

__declspec(dllimport) int test();

int main () {
test();
return 0;
}

das ist aber schonmal nicht schön geschrieben :wink:

Wenn du dllimport/export verwendest, muss das auch bei deiner definition in der .cpp-Datei so sein.

Sprich

.hpp
#ifndef \_BLAH\_HPP\_
#define \_BLAH\_HPP\_
\_\_declspec(dllexport) int test();
#endif // \_BLAH\_HPP\_

.cpp
\_\_declspec(dllexport) int test()
{
 return 42;
}

Normalerweise macht man das aber schöner, dass man die Header mehrfach verwenden kann:

#ifdef \_MEINPROGRAMM\_EXPORTS\_
# define MEINPROGRAMM\_API \_\_declspec(dllexport)
#else // \_MEINPROGRAMM\_EXPORTS\_
# define MEINPROGRAMM\_API \_\_declspec(dllimport)
#endif // \_MEINPROGRAMM\_EXPORTS\_

Und dann einfach

MEINPROGRAMM\_API int test()
{
 return 42;
}

Beim kompilieren deines Programms dann _MEINPROGRAMM_EXPORTS_ definieren, bei jedem externen Programm nicht mehr :smile:

Grüße,
Christoph

Hallo,

ich weiß, der Code war nicht schön. Ich hatte alles unnötige rausgeschmissen um Fehler zu vermeiden. Hat nix geholfen. ;(

Scheint als könnte man mit g++ keine in VC++ 6.0 erzeugten dlls benutzen. Zumindest gebe ich jetzt auf. Trotzdem danke für eure Hilfe.

Torsten

Danke, Torsten

Hast du in der main die header datei wirklich nicht
eingebunden? Hast du dem linker die richtigen parameter
übergeben? Kenne mich leider nicht mit dem tool aus. Aber auch
dir würde ich zu der kostenlosen MS VS Cpp expressversion
raten :smile:

Der Code war auf das nötigste reduziert. Deshalb keine Headerdatei.

Die Parameter sollten stimmen. Ich hatte es auch schon mit anderen getestet. Ohne Erfolg.

VS würde ich zur Not benutzen. Aber der Admin hier hat nicht viel Zeit für Diplomanden… *grrr*

Torsten

Hallo,

ich weiß, der Code war nicht schön. Ich hatte alles unnötige
rausgeschmissen um Fehler zu vermeiden. Hat nix geholfen. ;(

Scheint als könnte man mit g++ keine in VC++ 6.0 erzeugten
dlls benutzen. Zumindest gebe ich jetzt auf. Trotzdem danke
für eure Hilfe.

Ups, dass die Dll mit VC++ 6 erzeug wurde, hab ich ganz übersehen …

Es geht auf jeden fall über GetProcAddress(…), was aber eine recht nervige (aber dynamische) Lösung ist :smile:

typedef int(\*TestFunction)(void);

TestFunction meineFunktion = (TestFunction)GetProcAddress(hLib, "test");
if ( meineFunktion )
 int blub = meineFunktion();

Den anderen Weg weiß ich leider gerade nicht auswendig :frowning:

Grüße,
Christoph