Die SDK Scripte mit GCC Kompilieren: iowkittest.c

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
FelixA
Posts: 27
Joined: Sat Aug 13, 2005 4:42 pm

Die SDK Scripte mit GCC Kompilieren: iowkittest.c

Post by FelixA »

Hallo Leute,
ich wollte für meinen Warrior40 C Scripte unter Linux kompilieren. Als ich jedoch das mitgelieferte iowkittest.c mit gcc kompilieren wollte, erhielt ich folgende Fehlermeldungen:

Code: Select all

/tmp/cco4vLS6.o(.text+0x18): In function `WriteSimple':
: undefined reference to `IowKitGetProductId'
/tmp/cco4vLS6.o(.text+0x48): In function `WriteSimple':
: undefined reference to `IowKitWrite'
/tmp/cco4vLS6.o(.text+0x7d): In function `WriteSimple':
: undefined reference to `IowKitWrite'
/tmp/cco4vLS6.o(.text+0xc1): In function `main':
: undefined reference to `IowKitOpenDevice'
/tmp/cco4vLS6.o(.text+0xea): In function `main':
: undefined reference to `IowKitGetNumDevs'
/tmp/cco4vLS6.o(.text+0x124): In function `main':
: undefined reference to `IowKitGetDeviceHandle'
/tmp/cco4vLS6.o(.text+0x141): In function `main':
: undefined reference to `IowKitGetSerialNumber'
/tmp/cco4vLS6.o(.text+0x153): In function `main':
: undefined reference to `IowKitGetProductId'
/tmp/cco4vLS6.o(.text+0x1bc): In function `main':
: undefined reference to `IowKitSetWriteTimeout'
/tmp/cco4vLS6.o(.text+0x28a): In function `main':
: undefined reference to `IowKitWrite'
/tmp/cco4vLS6.o(.text+0x2ab): In function `main':
: undefined reference to `IowKitReadImmediate'
/tmp/cco4vLS6.o(.text+0x2f8): In function `main':
: undefined reference to `IowKitCloseDevice'
collect2: ld returned 1 exit status
Der gleiche Fehler kam bei KDevelop. Könnt ihr mir sagen woran es liegt und wie ich diesen Fehler beheben kann?
Hab ihr schon eigene C Scripte für den Warrior unter Linux kompiliert?

Danke.

Liebe Grüße,
Felix
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

Hallo Felix,

für die angezeigten fehlermeldungen gibt es zwei mögliche Ursachen:
1.
Du hast vergessen beim kompilieren das programm mit der libiowkit.so zu
linken. Richtig wäre ein Aufruf wie dieser hier:

Code: Select all

gcc -Wall -g -liowkit iowkittest.c -o iowkittest
Damit der Linker (Parameter -liowkit) die library (libiowkit.so) auch finden
kann, muss diese Datei allerdings in einem der Verzeichnisse stehen, die der Linker
automatisch durchsucht. Üblicherweise wären dass wohl:
/usr/lib oder /usr/local/lib
Damit die obige Aufruf von gcc erfolgreich ist wäre also (als root!) folgendes zu
tun

Code: Select all

cd InDasVerzeichnisWo-libiowkit.so-Ist
#die libiowkit in eines der Verzeichnisse kopieren die der Linker durchsucht
cp libiowkit.so /usr/local/lib 
#der nächste befehl, beschleunigt den programmstart für anwendungen
#die dynamisch mit libiowkit.so gelinkt wurden
ldconfig 
2.
Es hat schon ein Problem beim Erzeugen der libiowkit.so gegeben, das dazu
geführt hat, dass die als fehlend angezeigten Funktionen nicht in die lib
aufgenommen worden sind. Das kannst du allerding leicht mit dem Programm
nm nachprüfen:

Code: Select all

#Ein Aufruf von nm
nm libiowkit.so
#Sollte etwa folgendes ausgeben
# erstmal alles mögliche an internen Sachen ...
00001200 t call_gmon_start
         U close@@GLIBC_2.0
# aber irgendwann sollte auch etwas wie das hier erscheinen !
00003200 b IoWarriors
000012e8 t IowiClear
000013c8 t IowiGetDeviceByHandle
00001fa8 T IowKitCancelIo
0000195d T IowKitCloseDevice
00001828 T IowKitGetDeviceHandle
00001811 T IowKitGetNumDevs
000018f5 T IowKitGetProductId
00001929 T IowKitGetRevision
00001877 T IowKitGetSerialNumber
00001fb2 T IowKitGetThreadHandle
0000143b T IowKitOpenDevice
00001afd T IowKitRead
00001d42 T IowKitReadImmediate
00001ad6 T IowKitSetLegacyOpenMode
0000199e T IowKitSetTimeout
00001a3a T IowKitSetWriteTimeout
00001fbc T IowKitVersion
00001eb2 T IowKitWrite
000024e4 T Java_com_codemercs_iow_IowKit_cancelIo
00001ff8 T Java_com_codemercs_iow_IowKit_closeDevice
00002336 T Java_com_codemercs_iow_IowKit_getDeviceHandle
00002312 T Java_com_codemercs_iow_IowKit_getNumDevs
0000236e T Java_com_codemercs_iow_IowKit_getProductId
000023a6 T Java_com_codemercs_iow_IowKit_getRevision
000023de T Java_com_codemercs_iow_IowKit_getSerialNumber
0000255c T Java_com_codemercs_iow_IowKit_getThreadHandle
00001fd4 T Java_com_codemercs_iow_IowKit_openDevice
00002114 T Java_com_codemercs_iow_IowKit_read
00002256 T Java_com_codemercs_iow_IowKit_readImmediate
00002458 T Java_com_codemercs_iow_IowKit_setTimeout
0000249e T Java_com_codemercs_iow_IowKit_setWriteTimeout
0000252a T Java_com_codemercs_iow_IowKit_version
0000202a T Java_com_codemercs_iow_IowKit_write
# usw...
Wichtig ist, dass vor den Funktionen der IowKit.lib der Buchstabe T
angezeigt wird! Das T bedeutet, dass die Funktion in der lib auch
tatsächlich definiert ist.

Sollte statt dessen ein U vor den entsprechenden Funktionen stehen,
sind die Definitionen nicht in die libiowkit.so aufgenommen worden. Dies
könnte aber eigentlich nur dann passiert sein, wenn Du versucht hast die Lib
neu zu erzeugen. In der libiowkit.so, die von Codemercs mitgeliefert wird,
sind alle notwendigen Funktionen direkt definiert.

Aber ich denke mal Du hast eher das Problem Nummer 1.
Versuchs zuerst mal mit der oben beschriebenen Vorgehenweise (Lib installieren, dann
test kompilieren), und falls das nicht hilft, meld dich noch mal!

Grüße Eberhard
stefan-tiger
Posts: 33
Joined: Wed Mar 15, 2006 2:37 pm
Location: Pforzheim

Post by stefan-tiger »

Ich hab das selbe Problem unter Windows.

Ich hab mein makefile zwar ergänzt, jedoch finde ich die Datei "libiowkit.a" nicht die ich dazulinken muss.

Wie komme ich auf den Namen?
Unter Qt4 heissen die libs "lib<name>.a".

Wie heisst die Datei unter Windows?
stefan-tiger
Posts: 33
Joined: Wed Mar 15, 2006 2:37 pm
Location: Pforzheim

Post by stefan-tiger »

Die Lösung ist denkbar einfach:

in der qmake-pro Datei einfach einfügen:

win32:LIBS += iowkit.lib


Juhu, meine Anwendung läuft nun unter Windows und Linux sofort aus den selben Sourcen (ohne etxra Anpassung) und hat eine grafische Oberfläche (Qt4), und das Wichtigste: der IO-Warrior funktioniert ebenso unter beiden OS.
Post Reply