mikrocontroller.net

Forum: PC-Programmierung C++ QT Creater FTD2xx.lib einbinden


Autor: TM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
INCLUDEPATH += c:/myLibs
LIBS += c:/myLibs/ftd2xx.lib
Auch die Header windows.h und ftd2xx.h sind eingebunden.

Trotzdem bekomme ich folgende Fehlermeldung
tmp/obj/debug_shared/mainwindow.o:C:\Qt\2010.05\qt\InteractiveHelloWorld
-build-desktop/../InteractiveHelloWorld/mainwindow.cpp:22: undefined
reference to `_imp__FT_Open@8'

collect2: ld returned 1 exit status

Vielleicht hatte von euch schon wer das gleiche Problem und kennt eine 
Lösung.

Danke schonmal im vorraus.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass Dir doch mal die komplette an den Linker übergebene Befehlszeile 
ausgeben, taucht da die von Dir angegebene Library überhaupt auf?

Autor: bcc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die lib ist evtl. nicht mit dem Compiler kompatibel.
Für bcc kann man z.B. hiermit eine neue erzeugen:
implib FTD2XX FTD2XX.dll

Autor: TM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: TM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Compiler spuckt in Verbindung mit der Lib noch das raus
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo
-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug/FTDLib.exe tmp/obj/
debug_shared/main.o tmp/obj/debug_shared/mainwindow.o tmp/obj/debug_shared/
moc_mainwindow.o -L'c:/Qt/2010.04/qt/lib' -L'c:/Qt/2010.04/qt/lib' -lmingw32 
-lqtmaind C:/myLibs/ftd2xx.lib -lQtGuid4 -lQtCored4 

Meinest du das mit Linkerbefehlszeile ?
Sieht nicht wirklich danach aus das er meine lib verlinkt oder ?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: TM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-
pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\FTDI.exe tmp/obj
/debug_shared/main.o tmp/obj/debug_shared/mainwindow.o tmp/obj/debug_shared
/moc_mainwindow.o  -L"c:\Qt\2010.05\qt\lib" -L"c:\Qt\2010.05\qt\lib" 
-lmingw32 -lqtmaind -lftd2xx -Lc:/myLibs -lQtGuid4 -lQtCored4 


Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: TM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wenn ich versuche die DLL einzubinden anstatt der .lib bekomm ich 
folgende Compilerausgabe:
LIBS += c:/myLibs/ftd2xx.dll
[c]
g++ -enable-stdcall-fixup -Wl,-enable-auto-import 
-Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o 
debug\FTDI.exe tmp/obj/debug_shared/main.o 
tmp/obj/debug_shared/mainwindow.o tmp/obj/debug_shared/moc_mainwindow.o 
-L"c:\Qt\2010.05\qt\lib" -L"c:\Qt\2010.05\qt\lib" -lmingw32 -lqtmaind 
c:/myLibs/ftd2xx.dll -lQtGuid4 -lQtCored4
[c]

Autor: TM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Axel Jäger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: TM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch das funktioniert nicht.
Folgende Kompiler meldung an den Linker
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-
pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\FTDI.exe tmp/obj
/debug_shared/main.o tmp/obj/debug_shared/mainwindow.o tmp/obj/debug_shared
/moc_mainwindow.o  -L"c:\Qt\2010.05\qt\lib" -L"c:\Qt\2010.05\qt\lib" 
-lmingw32 -lqtmaind -Lc:/myLibs -lftd2xx -lQtGuid4 -lQtCored4 

in myLib befinded sich die Datei ftd2xx.lib

Autor: besucher (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diese Seite aufrufen: 
http://www.mikrocontroller.net/articles/USB_IO_Expander

Suchen nach folgendem Text: "Achtung (nur Windows)"

Beim ersten und einzigen Treffer weiterlesen.

Autor: TM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch das funktioniert nicht.
Folgende Kompiler meldung an den Linker
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-
pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\FTDI.exe tmp/obj
/debug_shared/main.o tmp/obj/debug_shared/mainwindow.o tmp/obj/debug_shared
/moc_mainwindow.o  -L"c:\Qt\2010.05\qt\lib" -L"c:\Qt\2010.05\qt\lib" 
-lmingw32 -lqtmaind -Lc:/myLibs -lftd2xx -lQtGuid4 -lQtCored4 

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.

Autor: EagleUser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, ich hab das ganze unter Windows am Laufen mit MSVC Compiler 
(vielleicht hilfts ja trotzdem)

PRO File:
HEADERS += ftd2xx.h
LIBS+= ftd2xx.lib

(lib und h file liegen im gleichen Verzeichnis wie das pro file)

in meinem cpp File wo das ganze FTDI gebims verwendet werden soll 
include ich
#include "ftd2xx.h"

im ftd2xx.h file habe ich windows.h includiert
#ifndef FTD2XX_H
#define FTD2XX_H

#include "windows.h"


und dann gehts schon los...
    QStringList outtext;
    FT_STATUS ftStatus;
    FT_DEVICE_LIST_INFO_NODE *devInfo;
    DWORD numDevs;
    // create the device information list
    ftStatus = FT_CreateDeviceInfoList(&numDevs);
    if (ftStatus == FT_OK)
    {
        outtext << "Number of Devices: " << QString("%1").arg(numDevs) << "\n";
    }

Ich builde das ganze als Release und lege die ftd2xx.dll im release 
Verzeichnis ab!

Autor: TM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
LIBS += -Lc:/myLibs -lftd2xx
LIBS += c:/myLibs/lftd2xx.a
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\FTDI.exe tmp/obj/debug_shared/main.o tmp/obj/debug_shared/mainwindow.o tmp/obj/debug_shared/moc_mainwindow.o  -L"c:\Qt\2010.05\qt\lib" -L"c:\Qt\2010.05\qt\lib" -lmingw32 -lqtmaind c:/myLibs/ftd2xx.a -lQtGuid4 -lQtCored4 

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: TM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich das .a weglasse bei der zweiten Version findet er die Datei 
nicht

:: error: ftd2xx: No such file or directory

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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).

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: TM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: TM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und hast Du mal die von mir angesprochenen Punkte untersucht?

Autor: TM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: TM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja auf die Idee bin ich auch schon gekommen funktioniert aber leider 
auch nicht.

Gruß Tobias

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und was geschieht, wenn Du die Kommandozeile von Hand so eingibst:
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\FTDI.exe tmp/obj/debug_shared/main.o tmp/obj/debug_shared/mainwindow.o tmp/obj/debug_shared/moc_mainwindow.o  -L"c:\Qt\2010.05\qt\lib" -L"c:\mylibs" -lmingw32 -lqtmaind -lftd2xx -lQtGuid4 -lQtCored4 

Autor: TM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: TM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Isch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
#-------------------------------------------------
#
# Project created by QtCreator 2010-09-30T17:21:19
#
#-------------------------------------------------

QT       += core

QT       -= gui

TARGET = testFtdi
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app


LIBS += -L"c:\myLib\i386" -lftd2xx

INCLUDEPATH += c:/myLib

SOURCES += main.cpp

main.c
#include <QtCore/QCoreApplication>
#include <QDebug>

#include "windows.h"
#include "ftd2xx.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    FT_HANDLE ftHandle;
    FT_DEVICE ftDevice;
    FT_STATUS ftStatus;
    DWORD deviceID;
    char serialNumber[16];
    char description[64];

    ftStatus = FT_Open(0, &ftHandle);
    if(ftStatus != FT_OK) { // FT_Open failed
        return 1;
    }
    ftStatus = FT_GetDeviceInfo( ftHandle,
                                 &ftDevice,
                                 &deviceID,
                                 serialNumber,
                                 description,
                                 NULL );

    if (ftStatus == FT_OK) {
        if (ftDevice == FT_DEVICE_232R) qDebug() << "device is FT232R";
        else if (ftDevice == FT_DEVICE_2232C) qDebug() << "device is FT2232C/L/D";
        else if (ftDevice == FT_DEVICE_BM) qDebug() << "device is FTU232BM";
        else if (ftDevice == FT_DEVICE_AM) qDebug() << "device is FT8U232AM";
        else qDebug() << "unknown device (this should not happen!)";
        // deviceID contains encoded device ID
        qDebug() << "SerialNumber: " << serialNumber;
        qDebug() << "Description: " << description;
    } else {
        qDebug() << "FT_GetDeviceType FAILED!";
    }

    FT_Close(ftHandle);


    return 0;
}

Linkerbefehl
g++ -enable-stdcall-fixup -Wl,-enable-auto-import 
-Wl,-enable-runtime-pseudo-reloc -Wl,-subsystem,console 
-mthreads -Wl -o debug\testFtdi.exe debug/main.o 
-L"c:\Qt\2010.04\qt\lib" -Lc:\myLib\i386 -lftd2xx -lQtCored4

Ausgabe
device is FT2232C/L/D 

SerialNumber:  FTT6EDF0A 
Description:  Olimex OpenOCD JTAG A 

Autor: TM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: OOlaese (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Immer wieder gerne!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.