C Probleme mit Linker

S

samotyr

Gast
Hallo Freunde,

ich arbeite derzeit an einen Treiber für ein USB-Gerät unter Linux. Angefangen hatte ich mit dem Skelett-Treiber, damit ging alles gut.

Jetzt bin ich umgestiegen auf libusb, da sich die Anforderungen an den Treiber geändert haben.
Ich versuche das ganze jetzt auch mit Eclipse statt mit vim + makefiles und hier fangen auch schon die Probleme an. Die Headerdatei mit den Definitionen lässt sich noch einfach einbinden, aber beim Linker scheitert es.

Ich gebe über die Projekteinstellungen den Suchpfad für libs an mit:
-L/usr/local/lib

und als lib:
-lusb

Er findet aber die c-Funktionen nicht
(...)undefined reference to `libusb_init'

Ich sollte dazu auch erwähnen, dass ich mein eigenen libusb kompiliert habe und nicht das aus den Packetquellen genommen habe, die war mir zu alt.

Ich steh ein bissle auf dem Schlauch, vielleicht könnt ihr mir einen Tipp geben?
 
Zuletzt bearbeitet:
-L/usr/local/lib <- fehlt da ein Leerzeichen vor dem /usr?
 
ist die c-funktion als export deklariert?
 
Du meinst in der libusb.h? Nein, der Prototyp sieht so aus:
int libusb_init(libusb_context **ctx);

Und ich versuche mit
int r;
r = libusb_init(NULL);
das ganze aufzurufen.

Meintest du export oder extern?

Edit:
Benutze jetzt Version 0.1, da klappt alles so, wie ich es eingestellt habe. Vermute dann mal, dass mit der lib was nicht stimmt :(
 
Zuletzt bearbeitet:
€: Nächstes Mal les ich dein Post ganz. Versprochen :(

€2: Vielleicht doch was konstruktives. Guck dir mal die exports der lib an. (nm)
 
Zuletzt bearbeitet:
Danke für die Antwort. Blöde Frage: wo sind die exports? In der header gab's sie zumindest nicht. Die lib Dateien (linusb.so*) sind binär Dateien.
Ich vermute die libusb ist auch eher ein Wrapper für die Standard usb lib.

Edit:
export ist kein Schlüsselwort in C. Ihr müsst mich mal Aufklären, was ihr genau damit meint.
Die libusb ist, wie gesagt, in C programmiert.
 
Zuletzt bearbeitet:
Exports sind Funktionen die man von Außen aufrufen kann. Also quasi alles, was nicht mit static deklariert ist.
nm zeigt dir diese an.
 
Klasse, danke für den Tipp. So lernt man dazu.

Der Output ist folgender:

Für libusb-1.0.so:
Code:
00001f08 a _DYNAMIC
00001ff4 a _GLOBAL_OFFSET_TABLE_
         w _Jv_RegisterClasses
00001ef8 d __CTOR_END__
00001ef4 d __CTOR_LIST__
00001f00 d __DTOR_END__
00001efc d __DTOR_LIST__
00000444 r __FRAME_END__
00001f04 d __JCR_END__
00001f04 d __JCR_LIST__
0000200c A __bss_start
         w __cxa_finalize@@GLIBC_2.1.3
000003f0 t __do_global_ctors_aux
00000330 t __do_global_dtors_aux
00002008 d __dso_handle
         w __gmon_start__
000003e7 t __i686.get_pc_thunk.bx
0000200c A _edata
00002014 A _end
00000428 T _fini
000002cc T _init
0000200c b completed.6625
00002010 b dtor_idx.6627
000003b0 t frame_dummy

Ein init findet sich, aber mit Unterstrich.
 
Gibt es im libverzeichnis einen Symlink auf libusb-1.0.so (libusb.so -> libusb-1.0.so)?
Falls nicht, versuchs mal mit -lusb-1.0 oder leg den Symlink an.
 
Hatte ich schon gemacht, das ging nicht. Findet zwar dann die richtige lib, aber nicht die Funktion.
Man könnte höchstens noch die "echte" usb lib ersetzen mit einem Symlink auf die neue. Das hab ich noch nicht probiert.

Ich glaub die Sache ist etwas komplizierter, im Makefile zu einen der Beispiele sieht man, dass da einige hundert Zeilen Anweisungen von Nöten sind, um die Kompilierung in Gang zu bringen.

Schade eigentlich. Dachte man könnte die lib einfach selbst kompilieren und benutzen. Die 0.1er ist ja von apt eingerichtet und funktioniert quasi out of the box. Dafür reichen "L/usr/lib" und "-lusb".

Trotzdem danke für die Tipps. Und das mit nm war sehr hilfreich für mich für die Zukunft :)
 
Zurück
Oben