Hallo,
Ich bin gerade dabei den FT2232 mittels der D2xx libary auszulesen.
Nun möchte ich versuchen die FTD2xx.lib in mein Projekt einzubinden doch
aus irgendeinem Grund gelingt das nicht ganz.
Folgendes habe ich in der pro Datei eingefügt um die Libs einzubinden
1
INCLUDEPATH+=c:/myLibs
2
LIBS+=c:/myLibs/ftd2xx.lib
Auch die Header windows.h und ftd2xx.h sind eingebunden.
Trotzdem bekomme ich folgende Fehlermeldung
Rufus t. Firefly schrieb:> Lass Dir doch mal die komplette an den Linker übergebene Befehlszeile> ausgeben, taucht da die von Dir angegebene Library überhaupt auf?
Hört sich nach ner guten Idee an kann ich allerdings erst morgen machen.
Wie kann man sich die Befehlzeile ausgeben lassen, geht das schon vom
QTCreator her oder muss ich da selbst etwas rumwerkeln?
Ich nutze QTCreater übrigends unter Windows hatte ich vergessen zu
erwähnen
TM schrieb:> Meinest du das mit Linkerbefehlszeile ?
Exakt.
> Sieht nicht wirklich danach aus das er meine lib verlinkt oder ?
Genau. Zwar taucht der Name der Library auf, aber auf falsche Art und
Weise. Außerdem dürften Libraries bei dem von Dir verwendeten Compiler
auf .a enden, nicht auf .lib, was wohl auch ein Format-, und nicht nur
Namensproblem sein dürfte.
Das ist aber nur eine Vermutung, ich nutze kein gcc für Windows.
Rufus t. Firefly schrieb:> Zwar taucht der Name der Library auf, aber auf falsche Art und> Weise.
Ja. Ich würde mal versuchen:
1
LIBS += -lftd2xx -Lc:/myLibs
> Außerdem dürften Libraries bei dem von Dir verwendeten Compiler> auf .a enden, nicht auf .lib, was wohl auch ein Format-, und nicht nur> Namensproblem sein dürfte.
Kommt drauf an. Wenn es eine Shared-Lib ist (alias "DLL"), dann gibt es
dazu auch ein .lib-File, das man aber meines Wissens bei gcc nicht
braucht. Man kann direkt an die DLL linken.
Rolf Magnus schrieb:> Rufus t. Firefly schrieb:>>> Zwar taucht der Name der Library auf, aber auf falsche Art und>> Weise.>> Ja. Ich würde mal versuchen:> LIBS += -lftd2xx -Lc:/myLibs>>> Außerdem dürften Libraries bei dem von Dir verwendeten Compiler>> auf .a enden, nicht auf .lib, was wohl auch ein Format-, und nicht nur>> Namensproblem sein dürfte.>> Kommt drauf an. Wenn es eine Shared-Lib ist (alias "DLL"), dann gibt es> dazu auch ein .lib-File, das man aber meines Wissens bei gcc nicht> braucht. Man kann direkt an die DLL linken.
Nun bekomm ich folgende Compiler meldungen über den Linker, aber der
Fehler bleibt.
Rolf Magnus schrieb:> Wenn es eine Shared-Lib ist (alias "DLL"), dann gibt es> dazu auch ein .lib-File, das man aber meines Wissens bei gcc nicht> braucht. Man kann direkt an die DLL linken.
Rein technisch: Wie soll das gehen? Die zur DLL gehörende Library ist
eine sogenannte "importlibrary", sie enthält Funktionsrümpfe, die vom
Programmstarter mit denen aus der zum Programmstart geladenen DLL
ersetzt werden. Von der Programmierseite unterscheidet sich das nicht
vom Aufruf von in statisch gelinkten Libraries enthaltenen Funktionen.
Die Alternative, Funktionen ohne Importlibrary aus einer DLL zu
verwenden, erfordert zur Laufzeit Aufrufe von Funktionen wie LoadLibrary
und GetProcAddress - was also erhebliche Anpassungen auf der
Programmseite erfordert.
Wenn gcc direkt "an" eine DLL linken können soll, muss gcc entweder
"on-the-fly" eine Importlibrary erzeugen oder irgendeinen magischen,
anderen Weg beschreiten.
Und das Erzeugen der Importlibrary schlägt dann fehl, wenn die DLL in
ihrer Exporttabelle keine symbolischen Namen, sondern nur Ordinale
(Nummern) verwendet; ja, so eine Perversion hat MS durchaus auch
vorgesehen. In so einem Fall kann man ohne anderweitig erzeugter
Importlibrary oder des .DEF-Files gar nichts mit der DLL anfangen.
Rufus t. Firefly schrieb:>> dazu auch ein .lib-File, das man aber meines Wissens bei gcc nicht>> braucht. Man kann direkt an die DLL linken.Rufus t. Firefly schrieb:> Rolf Magnus schrieb:>> Wenn es eine Shared-Lib ist (alias "DLL"), dann gibt es>> dazu auch ein .lib-File, das man aber meines Wissens bei gcc nicht>> braucht. Man kann direkt an die DLL linken.>> Rein technisch: Wie soll das gehen? Die zur DLL gehörende Library ist> eine sogenannte "importlibrary", sie enthält Funktionsrümpfe, die vom> Programmstarter mit denen aus der zum Programmstart geladenen DLL> ersetzt werden. Von der Programmierseite unterscheidet sich das nicht> vom Aufruf von in statisch gelinkten Libraries enthaltenen Funktionen.>> Die Alternative, Funktionen ohne Importlibrary aus einer DLL zu> verwenden, erfordert zur Laufzeit Aufrufe von Funktionen wie LoadLibrary> und GetProcAddress - was also erhebliche Anpassungen auf der> Programmseite erfordert.>> Wenn gcc direkt "an" eine DLL linken können soll, muss gcc entweder> "on-the-fly" eine Importlibrary erzeugen oder irgendeinen magischen,> anderen Weg beschreiten.>> Und das Erzeugen der Importlibrary schlägt dann fehl, wenn die DLL in> ihrer Exporttabelle keine symbolischen Namen, sondern nur Ordinale> (Nummern) verwendet; ja, so eine Perversion hat MS durchaus auch> vorgesehen. In so einem Fall kann man ohne anderweitig erzeugter> Importlibrary oder des .DEF-Files gar nichts mit der DLL anfangen.
Ok also die .lib einbinden aber wie ?
Muss ich diese eventuell wirklich in eine anderes Format konvertieren?
TM schrieb:> LIBS += c:/myLibs/ftd2xx.dll
Das kann auch nicht funktionieren.
LIBS += -Lc:/myLibs -lftd2xx
Sorum: Erst Verzeichnis zum Suchpfad hinzufügen und dann gegen die lib
linken.
in myLib befinded sich die Datei ftd2xx.lib
besucher schrieb:> Diese Seite aufrufen:> http://www.mikrocontroller.net/articles/USB_IO_Expander>> Suchen nach folgendem Text: "Achtung (nur Windows)">> Beim ersten und einzigen Treffer weiterlesen.
Ok das hilft schonmal jetzt weiß ich wo das Problem ist.
Ich habe allerdings keine FTD2xx.def Datei und leider liegt auch bei der
USB_IO_Expander Software keine FTD2XX.a Libary bei.
besucher schrieb:> Diese Seite aufrufen:> http://www.mikrocontroller.net/articles/USB_IO_Expander>> Suchen nach folgendem Text: "Achtung (nur Windows)">> Beim ersten und einzigen Treffer weiterlesen.
Haben mir nun mit Hilfe von MINGW zuerst mittels pexports eine .def
erstellt
Anschließend weiter mittels dllimport aus der dll und der neuen .def
eine .a Libary.
Diese habe ich nun eigebunden, aber die Fehler bleiben.
Folgende Befehlszeile wird dem Linker übergeben:
Außerdem habe ich das einbinden der LIB auf diese beiden Wege versucht:
TM schrieb:> Außerdem habe ich das einbinden der LIB auf diese beiden Wege versucht:LIBS +=
-Lc:/myLibs -lftd2xx
> LIBS += c:/myLibs/lftd2xx.a
Lass beim zweiten Versucht mal das .a weg, das wird bei anderen
Libraries schließlich auch nicht angegeben.
Betrachtet man die Kommandozeile, so sieht man dort mehrere -L -Angaben,
die von -l -Angaben gefolgt werden. Möglicherweise (das ist nur eine
Vermutung) darf nach Angabe einer zu verwendenden Library (-l) keine
weitere Verzeichnisangabe (-L) erfolgen.
Ansonsten könnte es auch sein, daß Libraries von diesem Compiler/Linker
mit einem anderen Namensschema verwendet werden, sieh Dir mal an, wie im
Verzeichnis -"c:\Qt\2010.05\qt\lib"
die Libraries qtmaind, QtGuid4 und QtCored4 benannt werden.
Heißen die Dateien dort möglicherweise
libqtmaind.a, libQtGuid4.a und libQtCored4.a?
Achja, und achte auf korrekte Groß- und Kleinschreibung. gcc wird gerne
fehlerhaft auf Windows-Systeme portiert und kann entgegen der
Gepflogenheiten des Dateisystems nicht BLAFUSEL finden, wenn blafusel
angegeben wird. Das ist auf unixoiden Betriebssystemen auch korrekt,
aber eben unter Windows ein Fehler (den zu diskutieren mit den
Portierern von gcc sinnlos ist, denn die sind der Ansicht, daß der
Fehler auf Windows-Seite läge).
Rufus t. Firefly schrieb:> Rolf Magnus schrieb:>> Wenn es eine Shared-Lib ist (alias "DLL"), dann gibt es>> dazu auch ein .lib-File, das man aber meines Wissens bei gcc nicht>> braucht. Man kann direkt an die DLL linken.>> Rein technisch: Wie soll das gehen?
Keine Ahnung. Ich habe ehrlich gesagt noch nicht einmal verstanden, wozu
man diese import-Lib überhaupt braucht.
Hier gibt's jedenfalls einen Link zu dem Thema, der vielleicht auch bei
der ursprünglichen Frage hilft:
http://www.mingw.org/wiki/CreateImportLibraries
Rufus t. Firefly schrieb:> Betrachtet man die Kommandozeile, so sieht man dort mehrere -L -Angaben,> die von -l -Angaben gefolgt werden. Möglicherweise (das ist nur eine> Vermutung) darf nach Angabe einer zu verwendenden Library (-l) keine> weitere Verzeichnisangabe (-L) erfolgen.>> Ansonsten könnte es auch sein, daß Libraries von diesem Compiler/Linker> mit einem anderen Namensschema verwendet werden, sieh Dir mal an, wie im> Verzeichnis -"c:\Qt\2010.05\qt\lib">> die Libraries qtmaind, QtGuid4 und QtCored4 benannt werden.>> Heißen die Dateien dort möglicherweise>> libqtmaind.a, libQtGuid4.a und libQtCored4.a?
Ja so heißen sie.
Wo werden den diese Dateien gelinkt vllt kann ich meine Libary einfach
mit in den Ordner packen und in bei dann zum Linken hinzufügen.
> Ich habe ehrlich gesagt noch nicht einmal verstanden,> wozu man diese import-Lib überhaupt braucht.
Windows-Programme enthalten eine Tabelle mit vom Programmlader
aufzulösenden Referenzen auf in DLLs enthaltene Funktionen.
Beim Aufrufen des Programmes wird diese Tabelle untersucht und alle
darin aufgeführten DLLs in den Speicher geladen. Im Programmcode werden
Aufrufe der DLLs durch Verweise auf die Speicheradressen der geladenen
DLLs ersetzt, erst wenn dieser Vorgang vollständig abgeschlossen ist,
beginnt der eigentliche Start des Programmes. Bei Fehlern in dieser
Referenzauflösungsphase gibt der Programmlader entsprechende
Fehlermeldungen aus, daß entweder DLLs fehlen oder aber Funktionsaufrufe
in DLLs nicht gefunden werden.
Eine Importlibrary ist eine Library, die dem Linker gegenüber wie eine
statische Library erscheint, aber anstelle des eigentlichen Codes nur
nicht-aufgelöste Referenzen in der DLL enthält.
Mit diesem Mechanismus verhält sich aus Programmierersicht der in einer
DLL enthaltene Code genauso wie der in einer statischen, vom Linker
gelinkten Library. Fehlt eine DLL oder können benötigte Funktionen
("Prozedureinstiegspunkte") nicht gefunden werden, kann das die DLL
verwendende Programm nicht ausgeführt werden.
Ohne Importlibrary ist ein Aufruf von Funktionen in DLLs nur durch ein
Nachbilden der Funktionalität des Programmladers möglich, das geschieht
durch die Win32-API-Funktionen LoadLibrary und GetProcAdress, was der
Programmierer zu erledigen hat.
Das bedeutet einigen programmiertechnischen Mehraufwand, bietet aber die
Möglichkeit, gewisse Programmfunktionalität auch bei Fehlen der DLL zur
Verfügung zu stellen (was bei modular erweiterbarer Software mit einem
Plugin-artigen Konzept auch erforderlich ist).
Das hier vorliegende Problem dürfte hingegen ein komplett anderes sein,
nämlich die sich unterscheidenden Dateiformate für von verschiedenen
Compilern verwendeten Libraries und Objektdateien.
Rufus t. Firefly schrieb:> Das hier vorliegende Problem dürfte hingegen ein komplett anderes sein,> nämlich die sich unterscheidenden Dateiformate für von verschiedenen> Compilern verwendeten Libraries und Objektdateien.
Hmm ich habe es jetzt eigentlich zur .a Libary formatiert dürfte nicht
mehr das Problem sein.
Ich hab so ziehmlich alles oben genannte ausprobiert also verschiedene
varaialnten des Libs +=... habe die Lib in eine .a Lib konvertiert und
damit nochmal alles probiert haben anschließend mal meine libs zu den
anderen gepackt also den libqtmaind.a, libQtGuid4.a und libQtCored4.a.
und keinen Pfad angegeben und habe versucht das ganze direkt in der
Makefile zu schreiben.
Bei allem hatte ich kein Erfolg
> haben anschließend mal meine libs zu den anderen gepackt also> den libqtmaind.a, libQtGuid4.a und libQtCored4.a.
Fällt Dir was auf? In der Kommandozeile steht
-lqtmaind
aber die Library heißt
libqtmaind.a
Also: Benenne Deine Library um, so daß sie
libftd2xx.a
heißt.
Der Linker setzt automatisch "lib" vor die Dateinamen von Libraries.
Rufus t. Firefly schrieb:> -L"c:\Qt\2010.05\qt\lib" -L"c:\mylibs" -lmingw32 -lqtmaind -lftd2xx -lQtGuid4
-lQtCored4
Diesen Part habe ich in die Makefile per hand eigegeben. Tut sich
trotzdem nichts
Rufus t. Firefly schrieb:
> -L"c:\Qt\2010.05\qt\lib" -lmingw32 -lqtmaind -lftd2xx -lQtGuid4
Tschuldigung so musses sein meine libftd2xx.a liegt mittlerweile ja im
lib verzeichnus von qt
Dann solltest Du überprüfen, ob die symbolischen Namen in der Library
überhaupt mit denen vom Linker angekreideten korrelieren. Es gibt
unterschiedliche Konventionen, wie C- oder gar C++-Symbolnamen in in
Libraries verwendete übersetzt werden, beispielsweise wird oft ein
Unterstrich (_) vorangestellt.
Mittlerweile aber trifft man auch Varianten an, bei denen die
Stackbelegung zusätzlich codiert wird.
(Noch schlimmer wird es bei C++ mit dem dort verwendeten "name
mangling", aber darum müssen wir uns hier glücklicherweise nicht
kümmern)
Das ist in Deinem Beispiel der Fall:
mainwindow.cpp:22: undefined reference to `_imp__FT_Open@8'
Überprüfe also die in Deiner Library verwendeten Funktionsnamen auf dazu
passende Syntax.
Wie sehen die Symbolnamen aus, die das Werkzeug erzeugt hat, mit dem Du
Dir Deine Importlibrary erstellt hast?
Hallo,
bei mir lässt sich das unten stehende Projekt problemlos mit Qt Creator,
MinGw und den Originaldateien von FTDI erstellen.
(Qt Creator 2.0.0, Qt 4.7.0, Windows Xp)
Projektdatei
boar DANKE DANKE DANKE...
Ich saß da echt gestern und heute fast durchgehend an diesem Problem.
Mein Fehler war einfach nur das ich nicht die Libary unter i386 von den
FTDI Treibern genommen habe sonder die Static/i386
Und jetzt wird das Programm zumindest bei mir zu Hause schon einmal
vernünftig und ohne Fehler kompelliert.
Naja wenigstens hab ich einiges über Linker und Makefiles gelernt.
Super Unterstützung hier...