Linkerfehler mit libusb

Gast #1984972
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ß!
Gast #1985010
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?
Gast #1985028
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.
Gast #1985036
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.
Gast #1985050
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.
Gast #1985064
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.
Moderator Persönliche Seite #1985145
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]
Gast #1985171
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?
Moderator Persönliche Seite #1985215
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.
Gast #1985235
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!
Gast #1985262
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren