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


von TM (Gast)


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
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
1
tmp/obj/debug_shared/mainwindow.o:C:\Qt\2010.05\qt\InteractiveHelloWorld
2
-build-desktop/../InteractiveHelloWorld/mainwindow.cpp:22: undefined
3
reference to `_imp__FT_Open@8'
4
5
collect2: ld returned 1 exit status

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

Danke schonmal im vorraus.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von bcc (Gast)


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

von TM (Gast)


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

von TM (Gast)


Lesenswert?

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

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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Rolf Magnus (Gast)


Lesenswert?

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.

von TM (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von TM (Gast)


Lesenswert?

Und wenn ich versuche die DLL einzubinden anstatt der .lib bekomm ich 
folgende Compilerausgabe:
1
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]

von TM (Gast)


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?

von Axel Jäger (Gast)


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.

von TM (Gast)


Lesenswert?

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

in myLib befinded sich die Datei ftd2xx.lib

von besucher (Gast)


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.

von TM (Gast)


Lesenswert?

Auch das funktioniert nicht.
Folgende Kompiler meldung an den Linker
1
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-
2
pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\FTDI.exe tmp/obj
3
/debug_shared/main.o tmp/obj/debug_shared/mainwindow.o tmp/obj/debug_shared
4
/moc_mainwindow.o  -L"c:\Qt\2010.05\qt\lib" -L"c:\Qt\2010.05\qt\lib" 
5
-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.

von EagleUser (Gast)


Lesenswert?

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

PRO File:
1
HEADERS += ftd2xx.h
2
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
1
#include "ftd2xx.h"

im ftd2xx.h file habe ich windows.h includiert
1
#ifndef FTD2XX_H
2
#define FTD2XX_H
3
4
#include "windows.h"


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

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

von TM (Gast)


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:
1
LIBS += -Lc:/myLibs -lftd2xx
1
LIBS += c:/myLibs/lftd2xx.a
1
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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von TM (Gast)


Lesenswert?

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

:: error: ftd2xx: No such file or directory

von Rufus Τ. F. (rufus) Benutzerseite


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).

von Rolf Magnus (Gast)


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

von TM (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von TM (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und hast Du mal die von mir angesprochenen Punkte untersucht?

von TM (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von TM (Gast)


Lesenswert?

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

Gruß Tobias

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und was geschieht, wenn Du die Kommandozeile von Hand so eingibst:
1
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

von TM (Gast)


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

von TM (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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?

von Isch (Gast)


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
1
#-------------------------------------------------
2
#
3
# Project created by QtCreator 2010-09-30T17:21:19
4
#
5
#-------------------------------------------------
6
7
QT       += core
8
9
QT       -= gui
10
11
TARGET = testFtdi
12
CONFIG   += console
13
CONFIG   -= app_bundle
14
15
TEMPLATE = app
16
17
18
LIBS += -L"c:\myLib\i386" -lftd2xx
19
20
INCLUDEPATH += c:/myLib
21
22
SOURCES += main.cpp

main.c
1
#include <QtCore/QCoreApplication>
2
#include <QDebug>
3
4
#include "windows.h"
5
#include "ftd2xx.h"
6
7
int main(int argc, char *argv[])
8
{
9
    QCoreApplication a(argc, argv);
10
11
    FT_HANDLE ftHandle;
12
    FT_DEVICE ftDevice;
13
    FT_STATUS ftStatus;
14
    DWORD deviceID;
15
    char serialNumber[16];
16
    char description[64];
17
18
    ftStatus = FT_Open(0, &ftHandle);
19
    if(ftStatus != FT_OK) { // FT_Open failed
20
        return 1;
21
    }
22
    ftStatus = FT_GetDeviceInfo( ftHandle,
23
                                 &ftDevice,
24
                                 &deviceID,
25
                                 serialNumber,
26
                                 description,
27
                                 NULL );
28
29
    if (ftStatus == FT_OK) {
30
        if (ftDevice == FT_DEVICE_232R) qDebug() << "device is FT232R";
31
        else if (ftDevice == FT_DEVICE_2232C) qDebug() << "device is FT2232C/L/D";
32
        else if (ftDevice == FT_DEVICE_BM) qDebug() << "device is FTU232BM";
33
        else if (ftDevice == FT_DEVICE_AM) qDebug() << "device is FT8U232AM";
34
        else qDebug() << "unknown device (this should not happen!)";
35
        // deviceID contains encoded device ID
36
        qDebug() << "SerialNumber: " << serialNumber;
37
        qDebug() << "Description: " << description;
38
    } else {
39
        qDebug() << "FT_GetDeviceType FAILED!";
40
    }
41
42
    FT_Close(ftHandle);
43
44
45
    return 0;
46
}

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

Ausgabe
1
device is FT2232C/L/D 
2
3
SerialNumber:  FTT6EDF0A 
4
Description:  Olimex OpenOCD JTAG A

von TM (Gast)


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...

von OOlaese (Gast)


Lesenswert?

Immer wieder gerne!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.