mikrocontroller.net

Forum: Compiler & IDEs Linkerfehler mit libusb


Autor: Uli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß!

Autor: Olli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 
;)

Autor: Jakob F. (jmf123) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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%2...;

Autor: Uli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: mh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Schorsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: mh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: mh (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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]

Autor: Uli (Gast)
Datum:

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

Das ist er:
http://shop.embedded-projects.net/index.php?module...

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?

Autor: Uli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kurzer Nachtrag: Die USB-Anbindung muss wohl USBN9604 sein.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube, in diesem Artikel
http://www.rn-wissen.de/index.php/V-USB:_Ein_Firmw...
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.