Seite 1 von 1

[geloest]undef. ref. bei dll Zugriff

Verfasst: 9. Juni 2007 10:37
von butze
hi!

Für ein Projekt muss ich eine dll benutzen. Die dll wurde wahrscheinlich mit MS Visual Studio erstellt und kommt mit *.lib und *.dll (die dll ist aber laut depends22_x86 noch von weiteren dlls abhängig (liegen alle in einem Verzeichnis))

Ich selbst arbeite mit Windows XP, Eclipse und MinGW.

Zum Linken hab ich die Zeile "LIBS += C:\Programmieren\dll\RaptorLib.lib" in die pro File geschrieben.

Beim Compilieren bekomme ich folgende Meldungen:


Code: Alles auswählen

g++ -mthreads -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-s -Wl,-s -Wl,-subsystem,windows -o "release\DLL_TEST.exe" release\main.o  -L"c:\Programmieren\Qt\4.2.3\lib" -lmingw32 -lqtmain C:\Programmieren\dll\RaptorLib.lib -lQtGui4 -lQtCore4
release\main.o(.text+0x12):main.cpp: undefined reference to `RaptorLib::CRaptorBoard::GetSRAMBaseAddr()'
...

release\main.o(.text+0x15c4):main.cpp: more undefined references to `RaptorLib::CRaptorBoard::GetModBaseAddr(unsigned int)' follow
...
release\main.o(.text+0x2187):main.cpp: undefined reference to `RaptorLog::get()'

collect2: ld returned 1 exit status
mingw32-make[1]: *** [release\DLL_TEST.exe] Error 1
mingw32-make[1]: Leaving directory `C:/Programmieren/workspace/DLL_TEST'
mingw32-make: *** [release] Error 2
Hat er die Dll nicht geschluckt?

In der RaptorLib.h steht

Code: Alles auswählen

// DLL support
#ifndef EXPORT
    #if defined(_WIN32)
        #define EXPORT __declspec(dllexport)
    #else
        #define EXPORT
    #endif
#endif

namespace RaptorLib { hier kommen exports}
Was nun? Warum meckert er?

Lese mittlerweile seit gut 2 Tagen im Netz rum - die Qmake Hilfe ist in der Hinsicht nicht so pralle. Hab auch schon alle Threads aus diesem Forum durch ("statisch linken, dll linken ...." als schlüsselwörter)

Danke schonmal!

Verfasst: 9. Juni 2007 10:44
von Christian81
Raptor.lib ist eine Import-lib für msvc. du brauchst eine Raptor.dll.a oder Raptor.a

Verfasst: 9. Juni 2007 12:39
von butze
..und das heißt, dass ich die dll nur über MSVC ansprechen kann?

gibt es ne Möglichkeit die dll trotzdem anzusprechen? (habe schon etwas mit QLibrary rumexperimentiert, aber ohne etwas gebacken bekommen zu haben)

Verfasst: 9. Juni 2007 12:54
von Christian81
Wenn ich richtig in der Annahme bin dass raptor die library von www.librdf.org ist, dann ist auch eine mingw import lib dabei. Wenn nicht (und es eine C++ lib ist), dann heisst das, dass Du die lib mit MinGW erstellen musst.

Verfasst: 9. Juni 2007 13:27
von butze
ne das ist ne andere RaptorLib

ok, dann werd ich mal beim Auftraggeber danach fragen.

Klappt das dann so, wie ich es versucht habe?

In der RaptorLib.h steht u.a.

// DLL support
#ifndef EXPORT
#if defined(_WIN32)
#define EXPORT __declspec(dllexport)
#else
#define EXPORT
#endif
#endif

ist das jetzt auch MSVC spezifisch?

Gruß

und vielen Dank!

Verfasst: 9. Juni 2007 15:02
von Christian81
Nein, das ist nicht msvc spezifisch sondern windows-spezifisch. Ich würde noch ein __declspec(dllimport) im else-Zweig hinzufügen.
Wenn es eine C++ dll ist muss sie für mingw und msvc unterschiedlich sein da die C++ ABI nicht kompatibel ist

Verfasst: 20. Juni 2007 14:51
von butze
hi!

mit deiner Hilfe konnte ich den Auftraggeber dazu bringen, mir die dlls neu zu compilieren. Jetzt geht es einwandfrei! Danke nochmal!

Noch eine kleine Frage: Ich habe die dlls (jetzt mit *.libs) in einem Unterordner save liegen und würde gerne über eine relative Pfadangabe die LIBS laden lassen. (sonst muss jeder aus meiner Projektgruppe den Pfad ständig neu setzen...)

die direkte Anweisung geht:
LIBS += -L"C:\Programmieren\workspace\RaptorDllTest\save" -lpthreadGC2 \

wie bringe ich den dazu relativ im /save ordner zu suchen?

Gruß

Martin

Verfasst: 20. Juni 2007 15:02
von Christian81
Es sollte eigentlich mit -L ..\..\was\acuh\immer\ gehen.

Verfasst: 20. Juni 2007 17:00
von butze
hmm ich glaub ich bin zu blöde.

hab jetzt da stehen:

Code: Alles auswählen

win32:LIBS +=  -lqwt5 \    #das findet er
		     -L ..\..\save  -lpthreadGC2 \
		     -lRaptorLib \
	         -lPlxApi \

und es geht nicht...

Verfasst: 21. Juni 2007 18:29
von Christian81
Wie sieht denn die Zeile aus beim Linken? Sollte eigentlich funktionieren

Verfasst: 21. Juni 2007 18:38
von butze
er hat die Libs nicht gefunden.

mit:

Code: Alles auswählen

win32:LIBS +="./save/libqwt5.a" \
geht es. Nur mit den -l / -L operatoren ging es nie.


Danke nochmal für deine Hilfe!

Verfasst: 21. Juni 2007 18:44
von Christian81
Denke daran dass das nicht mit msvc so geht - also win32-g++:LIBs benutzen