Forum: Compiler & IDEs Linkerfehler mit libusb


von Uli (Gast)


Lesenswert?

Hallo,

vielleicht hatte schon jemand ein ähnliches Problem: Ich bekomme einen 
Fehler beim Linken mit der LibUSB. Eigentlich möchte ich ein hex-File 
erzeugen, um es auf einen AVR-Microcontroller zu laden. Das kompilieren 
klappt wunderbar und das Erzeugen von hex-Files geht auch, wenn keine 
Abhängigkeiten zur LibUSB eingebaut sind. Aber sobald ich die LibUSB 
einbinden möchte, findet der Linker keine Implementierung. Im gleichen 
Verzeichnis wie die zu kompilierenden Dateien sind die Dateien usb.h, 
libusb.a, libusb0.dll und libusb0.sys.

<include usb.h> ist drin, die Linker-Flags auch. Insgesamt sieht der 
Befehl im Makefile so aus:

>avr-gcc -mmcu=at90can128 -I. -L. -Ic:/MinGW/lib/gcc/mingw32/4.5.0/include 
-Ic:/MinGW/include -Wl,-Map=Demo.map Helloworld.o 
-L"C:\Programme\LibUSB-Win32\lib\gcc" -lusb -o Demo.elf

Als Fehlermeldung kommt:
"undefined reference to `usb_init'"
usw. für alle möglichen LibUSB-Funktionen

Was könnte denn noch fehlen? Ich probiere schon ewig rum und bin bald am 
Verzweifeln!

Achso: Die Umgebungsvariablen "AVR", "AVR_PATH", "AVR32_HOME" und 
"LIBUSB" sind gesetzt.
Wäre super wenn jemand was weiß!

von Olli (Gast)


Lesenswert?

Arbeite zwar normal nicht unter Windows und bin mir daher auch nicht 
sicher, aber benenn die libusb0.dll mal in libusb.dll um, evtl. hilfts 
;)

von Jakob F. (jmf123) Benutzerseite


Lesenswert?

Uli schrieb:
> Was könnte denn noch fehlen? Ich probiere schon ewig rum und bin bald am
> Verzweifeln!

Linke mal -lusb und zusätzlich -lusb0 oder -lusb-1 oder so ähnlich.

Siehe auch 
http://www.myunitsconverter.com/thread/813394/Wo%20befindet%20sich%20die%20Definition%20von%20'void%20usb_init(void)%20';

von Uli (Gast)


Lesenswert?

Erstmal danke für die Tipps!

Ich habe beides mal ausprobiert, hat jedoch nichts geholfen.
Das Umbenennen ändert nichts, da kommt trotzdem der selbe Fehler.
Und wenn ich die Linkerflag ändere kommt ein Fehler (cannot find -lusb0 
z.B.)

Ist übrigens mein erstes Windows-Projekt mit AVRs. In so nem Fall wäre 
mir Linux auch viel lieber. Da könnte ich jetzt ganz einfach mittracen, 
wo er denn überall schaut und was verwendet wird. Geht sowas in Windows?

von mh (Gast)


Lesenswert?

Uli schrieb:
>avr-gcc -mmcu=at90can128 -I. -L. -Ic:/MinGW/lib/gcc/mingw32/4.5.0/include
> -Ic:/MinGW/include -Wl,-Map=Demo.map Helloworld.o
> -L"C:\Programme\LibUSB-Win32\lib\gcc" -lusb -o Demo.elf

Willst du die libusb auf deinem avr benutzen? Die lib ist doch 
eigentlich für den Host-Computer zuständig.

von Uli (Gast)


Lesenswert?

Ja, richtig.
Trotzdem muss ich doch für ein usb_init, usb_find_devices usw. auch was 
auf dem AVR haben um drauf zugreifen zu können. Deshalb den Header als 
include, oder bring ich da was durcheinander?

von Schorsch (Gast)


Lesenswert?

Deine Lib ist kompatibel mit deinem Compiler?

Die sollte mit demselben Compiler (avr-gcc) und den selben Settings 
(-mcu=at90can128 ... ) kompiliert worden sein, wie der Rest deines 
Projektes.
Deshalb ist es oft einfacher, einfach den Lib-Quelltext mit ins 
Hauptprojekt zu nehmen.


Eine mit VisualC für intel-CPUs compilierte DLL kriegst du nicht in den 
AVR gelinkt.

von Uli (Gast)


Lesenswert?

Ok, da könnte das Problem liegen. Die Lib hab ich fertig aus dem Netz 
und nicht selbst gebaut. Das werd ich mal ausprobieren und die Lib 
selber kompilieren.

Obwohl. Ähm, Lib-Quelltext? Meinst du usb.h und usb.c? Ich hab das 
c-File bisher noch nirgends gefunden. Oder versteh ich das falsch?

Aber: Super Tipp, danke! Da komm ich erst mal etwas weiter.

von mh (Gast)


Lesenswert?

Der avr ist doch ein ein USB-Device oder? Wenn ja, brauchst du auch eine 
USB-Lib für ein Device und nicht für einen Host, wie es die libusb ist.

von Uli (Gast)


Lesenswert?

Ok, jetzt bin ich ganz durcheinander. Also das was ich bisher in irgend 
welchen Tutorials gelesen hab, versteh ich so, dass ich z.B. 
LibUSB-Win32 installiert haben muss. Dann kann ich gegen die libusb.a 
davon linken bzw. das Header-File inkludieren und die dll einbinden.

Ich will jetzt nicht anzweifeln, was du sagst. Ich komm einfach nicht 
ganz mit. Das was du sagst würde auch erklären, warum ich problemlos ein 
Exe-File bauen kann und das vom Host-Rechner laufen lassen kann. Und 
warum dass bauen des hex-Files für das Target nicht geht.

von mh (Gast)


Lesenswert?

Guck dich mal bei Atmel um, die müssten doch eigentlich einen USB-Stack 
für ihre Controller haben.

von holger (Gast)


Lesenswert?

>Ok, jetzt bin ich ganz durcheinander.

Das merkt man.

Der at90can128 kann kein USB. Punkt.
Die Libusb ist für PCs oder evtl. für Boards wo
EmbeddedLinux drauf läuft. Für einen AVR ist sie
jedenfalls NICHT.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nein, die LibUSB-Win32 ist nicht für deinen AVR geeignet.

Gehe zurück nach "Los!", ziehe nicht 4000 DM ein, und erkläre uns
als erstes mal, was für eine Controllerschaltung du hast und wie
deren USB-Anbindung denn realisiert ist.  Da du offenbar einen
AT90CAN128 benutzt, hat der zumindest erstmal keinen USB-PHY in
Silizium drin.

[Edit: Holger war 1 Minute schneller]

von Uli (Gast)


Lesenswert?

Monopoly? Gar nicht so schlecht der Vergleich. Also, von vorne:

Das ist er:
http://shop.embedded-projects.net/index.php?module=artikel&action=artikel&id=18

Dafür habe ich eine dll, ein c- und ein h-file. Dieses inkludiert so 
viel ich weiß von Haus aus schon die "usb.h".
Und dann bin ich davon ausgegangen, dass ich die der libusb-win32 nehmen 
kann/muss.
Da liegt wohl schon der Fehler, oder?

von Uli (Gast)


Lesenswert?

Kurzer Nachtrag: Die USB-Anbindung muss wohl USBN9604 sein.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Uli schrieb:
> Kurzer Nachtrag: Die USB-Anbindung muss wohl USBN9604 sein.

Das ist doch der entscheidende Punkt.  Diesen IC musst du also in
deiner Firmware ansteuern.

Nun lese ich dort:

"Alle Schaltpläne und Quelltexte von der Firmware bis zu den 
Bibliotheken und Treibern sind als Open Source freigegeben."

Dann solltest du dir also die dort vorhandene Firmware wohl mal
ansehen.  Die müssen ja eine Ansteuerung für den USBN9604 mit
dabei haben.

Die DLL ist für dein Windows, die hat nichts mit der Firmware zu tun.

von Uli (Gast)


Lesenswert?

Ah, so sieht das aus.
Also, jetzt wo du es sagst: Dann werd ich mir mal anschauen, wie das da 
gemacht wird. Da siehst du mal, wie wenig Ahnung ich von der Materie 
hab.
Aber jetzt weiß ich wenigstens, wie ich mich etwas schlauer machen kann.

Vielen Dank an alle bis hier hin mal!

von ingo (Gast)


Lesenswert?

Ich glaube, in diesem Artikel
http://www.rn-wissen.de/index.php/V-USB:_Ein_Firmware_USB-Treiber_f%C3%BCr_AVR
ist das Zusammenspiel eines USB-Gerätes (mit V-USBB) mit dem Programm 
auf der Hostseite ganz gut erklärt.
Ganz grob gesagt, Du baust dir eine inf-Datei, die die AVR-LIB für dein 
Gerät zuständig erklärt, dein Anwenderprogramm kommuniziert dann (unter 
Windows) mit dem Gerät "libusb" und lässt sich die Verbindung zu deinem 
Gerät (VID/PID) herstellen.

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.