[geloest]undef. ref. bei dll Zugriff

Alles rund um die Programmierung mit Qt
Antworten
butze
Beiträge: 39
Registriert: 7. Mai 2007 23:01

[geloest]undef. ref. bei dll Zugriff

Beitrag 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!
Zuletzt geändert von butze am 26. Juni 2007 15:40, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Raptor.lib ist eine Import-lib für msvc. du brauchst eine Raptor.dll.a oder Raptor.a
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
butze
Beiträge: 39
Registriert: 7. Mai 2007 23:01

Beitrag 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)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
butze
Beiträge: 39
Registriert: 7. Mai 2007 23:01

Beitrag 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!
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
butze
Beiträge: 39
Registriert: 7. Mai 2007 23:01

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Es sollte eigentlich mit -L ..\..\was\acuh\immer\ gehen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
butze
Beiträge: 39
Registriert: 7. Mai 2007 23:01

Beitrag 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...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wie sieht denn die Zeile aus beim Linken? Sollte eigentlich funktionieren
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
butze
Beiträge: 39
Registriert: 7. Mai 2007 23:01

Beitrag 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!
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Denke daran dass das nicht mit msvc so geht - also win32-g++:LIBs benutzen
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten