Terminalausgabe Testprogramm



  • Meiner Meinung nach, mache ich irgendwas beim Kompilieren mit g++ falsch, da muss
    in der Zeile irgendwie die Bibliothek verlinkt werden.

    Aber Dankeschön



  • Rufst du denn den Compiler per Hand auf? Warum überläßt du das nicht der IDE?

    Ansonsten informiere dich mal über die gcc-Optionen -l und -L...



  • Uii, das hast du schon 17 Stunden nachdem @Th69 dir das gesagt hat realisiert?



  • @Jockelx - Das wollten Sie mir jetzt mitteilen?



  • Was man dir die ganze Zeit zu erklären versucht:
    Der Compiler macht alles richtig, er übersetzt dein Programm und erzeugt die passenden Objektdateien. Danach ist der Linker dran und soll das alles zusammenbauen, scheitert aber, weil er Funktionseinsprungspunkte nicht findet. Dazu gibt´s jetzt zwei Lösungen:

    1. Du nimmst alle libUSB Quelltextdateien in dein Projekt auf, dann werden sie vom Compiler übersetzt und an den Linker weitergereicht.
    2. Du teilst dem Linker mit, dass sich die Funktionen in einer Bibliothek befinden und der Linker sucht in dieser Bibliothek nach den Einsprungspunkten.

    Ich habe den Eindruck, dass du C++ Anfänger bist und (noch) nicht weißt, wie du die Frage zu deinem Problem formulieren sollst. Daher kam auch die Aufforderung, die Fehlermeldungen zu posten, weil man daraus genau erkennen kann, wo das Problem liegt.
    Dass du jetzt darauf bestehst, dass das Problem beim Compiler liegt zeigt, dass du das Problem nicht verstanden hast. Vielleicht solltest du einfach mal die dir hier gegebenen Ratschläge befolgen, denn die Leute hier wissen, wovon sie reden.



  • @Timo_R Ja.
    Ich verstehe halt nicht, wieso man eine Frage stellt, aber die Antworten nicht liest.



  • @DocShoe --- Einmal 2. bittesehr ---



  • @Th69 sagte in Terminalausgabe Testprogramm:

    Wie willst du denn mit Libs arbeiten, wenn du nicht weißt, wie du diese einbinden mußt?

    Da du NetBeans benutzt, gehe in die Projekteigenschaften unter "Build"->"Linker" und füge dort die Lib (+ Pfad) hinzu, s. NetBeans: Quickstart "Setting Project Properties".

    Hat Th69 schon geschrieben. Ich benutze die NetBeans IDE nicht und habe keine Ahnung, wo man das da einstellen kann.



  • @Jockelx

    Wären Sie in den fachlichen Antworten hier im Forum so fähig, wie Sie es bei Anmerkungen zur Arbeitsweise anderer sind, hätte ich dieses Problem bestimmt schon gelöst.



  • @Timo_R sagte in Terminalausgabe Testprogramm:

    @Jockelx

    Wären Sie in den fachlichen Antworten hier im Forum so fähig, wie Sie es bei Anmerkungen zur Arbeitsweise anderer sind, hätte ich dieses Problem bestimmt schon gelöst.

    Uiiii. Böser Fehler. Regulars anzukacken ist selten eine gute Idee. Senkt die Bereitschaft anderer Regulars zu helfen enorm.



  • Ich möchte es aber separat mit g++ kompilieren -



  • ES IST KEIN COMPILERFEHLER!!!!einself
    Du musst dem LINKER den Namen der Bibliothek mitteilen.



  • Okay, dann gebe ich mal eine fachliche Antwort, auch wenn du sie sowieso ignorierst:

    @Th69 sagte in Terminalausgabe Testprogramm:

    Rufst du denn den Compiler per Hand auf? Warum überläßt du das nicht der IDE?

    Ansonsten informiere dich mal über die gcc-Optionen -l und -L...



  • @Jockelx

    Ich rufe den compiler g++ per Hand auf, wie Sie sagen.



  • @Timo_R
    Du kannst dem g++ durchaus Optionen für den Linker mitgeben.

    Die hatte Th69 schon genannt.
    Was da genau hin kommt, hängt von deinen Gegebenheiten (wo liegt die libusb) ab.



  • @DirkB

    Die libusb liegt in meinem Falle:

    /home/$user/NetBeansProjects/USB-Schnittstelle/libusb-1.0/

    Aber ich weiß in diesem Falle echt nicht weiter.



  • @Timo_R Eigeninitiative. Z.B. RTFM zu den gcc Optionen

    Die lib hat auch einen Namen. libusb.l oder so ähnlich.

    Teilweise muss man auch das lib von dem Namen weg lassen.

    Du kannst den Linker auch direkt aufrufen. Der heißt ld



  • @Timo_R sagte in Terminalausgabe Testprogramm:

    /home/$user/NetBeansProjects/USB-Schnittstelle/libusb-1.0/

    also vermutlich g++ <deine optionen> -L /home/$user/NetBeansProjects/USB-Schnittstelle/libusb-1.0 -l usb
    Wie das Argument von -l genau heißt (ich habe jetzt "usb" geraten, könnte aber auch "libusb" oder "usb-1" oder anders sein), erfährst du, indem du einfach mal guckst, wie die Dateien in dem Verzeichnis heißen. Gegebenenfalls brauchst du auch mehrere Libraries, also mehrere -l Parameter (die Reihenfolge ist bei mehreren auch noch zu beachten).



  • Das ist doch mal eine Ansage -
    werde ich gleich mal versuchen - Danke schonmal



  • Das Argument scheint schon "usb" zu sein, funktioniert aber mit nachfolgender Eingabe dennoch nicht:

    g++ TEST7.cpp -o TEST -L /home/$user/NetBeansProjects/USB-Schnittstelle/libusb-1.0 -l usb


    Kommt nachfolgendes, ich will keinen hier zu spamen, aber:

    TEST7.cpp: In function ‘int main()’:
    TEST7.cpp:33:29: warning: ‘void libusb_set_debug(libusb_context*, int)’ is deprecated: Use libusb_set_option instead [-Wdeprecated-declarations]
    libusb_set_debug(ctx, 3); //set verbosity level to 3, as suggested in the documentation
    ^
    In file included from TEST7.cpp:3:
    libusb.h:1325:18: note: declared here
    void LIBUSB_CALL libusb_set_debug(libusb_context *ctx, int level);
    ^~~~~~~~~~~~~~~~
    TEST7.cpp:33:29: warning: ‘void libusb_set_debug(libusb_context*, int)’ is deprecated: Use libusb_set_option instead [-Wdeprecated-declarations]
    libusb_set_debug(ctx, 3); //set verbosity level to 3, as suggested in the documentation
    ^
    In file included from TEST7.cpp:3:
    libusb.h:1325:18: note: declared here
    void LIBUSB_CALL libusb_set_debug(libusb_context *ctx, int level);
    ^~~~~~~~~~~~~~~~
    /usr/bin/ld: /tmp/ccJ3DqgT.o: in function main': TEST7.cpp:(.text+0x27): undefined reference tolibusb_init'
    /usr/bin/ld: TEST7.cpp:(.text+0x83): undefined reference to libusb_set_debug' /usr/bin/ld: TEST7.cpp:(.text+0x96): undefined reference tolibusb_get_device_list'
    /usr/bin/ld: TEST7.cpp:(.text+0x144): undefined reference to libusb_free_device_list' /usr/bin/ld: TEST7.cpp:(.text+0x150): undefined reference tolibusb_exit'
    /usr/bin/ld: /tmp/ccJ3DqgT.o: in function printdev(libusb_device*)': TEST7.cpp:(.text+0x199): undefined reference tolibusb_get_device_descriptor'
    /usr/bin/ld: TEST7.cpp:(.text+0x2c2): undefined reference to libusb_get_config_descriptor' /usr/bin/ld: TEST7.cpp:(.text+0x522): undefined reference tolibusb_free_config_descriptor'
    collect2: error: ld returned 1 exit status


    • Ich habe keine Ahnung, woran es liegt -

    Die libusb.h liegt im Verzeichnis

    /usr/include/libusb/libusb.h

    Habe diese gerade nochmal installiert als Paket.


    Source Code lautet, der getestet werden soll:

    #include <iostream>
    #include <libusb/libusb.h>
    #include "stdio.h"
    
    	using namespace std;
    
    	 
    
    	void printdev(libusb_device *dev); //prototype of the function
    
    	 
    
    	int main() {
    
    	    libusb_device **devs; //pointer to pointer of device, used to retrieve a list of devices
    
    	    libusb_context *ctx = NULL; //a libusb session
    
    	    int r; //for return values
    
    	    ssize_t cnt; //holding number of devices in list
    
    	    r = libusb_init(&ctx); //initialize a library session
    
    	    if(r < 0) {
    
    	        cout<<"Init Error "<<r<<endl; //there was an error
    
    	                return 1;
    
    	    }
    
    	    libusb_set_debug(ctx, 3); //set verbosity level to 3, as suggested in the documentation
    
                cnt = libusb_get_device_list(ctx, &devs); //get the list of devices
    
    	    if(cnt < 0) {
    
    	        cout<<"Get Device Error"<<endl; //there was an error
    
    	    }
    
    	    cout<<cnt<<" Devices in list."<<endl; //print total number of usb devices
    
    	        ssize_t i; //for iterating through the list
    
    	    for(i = 0; i < cnt; i++) {
    
    	                printdev(devs[i]); //print specs of this device
    
            }
    
    	        libusb_free_device_list(devs, 1); //free the list, unref the devices in it
    
    	        libusb_exit(ctx); //close the session
    
    	        return 0;
    
    	}
    
    	 
    	void printdev(libusb_device *dev) {
    
    	    libusb_device_descriptor desc;
    
    	    int r = libusb_get_device_descriptor(dev, &desc);
    
    	    if (r < 0) {
    
    	        cout<<"failed to get device descriptor"<<endl;
    
    	        return;
    
    	    }
    
    	    cout<<"Number of possible configurations: "<<(int)desc.bNumConfigurations<<"  ";
    
    	    cout<<"Device Class: "<<(int)desc.bDeviceClass<<"  ";
    
    	    cout<<"VendorID: "<<desc.idVendor<<"  ";
    
    	    cout<<"ProductID: "<<desc.idProduct<<endl;
    
    	    libusb_config_descriptor *config;
    
    	    libusb_get_config_descriptor(dev, 0, &config);
    
    	    cout<<"Interfaces: "<<(int)config->bNumInterfaces<<" ||| ";
    
    	    const libusb_interface *inter;
    
    	    const libusb_interface_descriptor *interdesc;
    
    	    const libusb_endpoint_descriptor *epdesc;
    
    	    for(int i=0; i<(int)config->bNumInterfaces; i++) {
    
    	        inter = &config->interface[i];
    
    	        cout<<"Number of alternate settings: "<<inter->num_altsetting<<" | ";
    
    	        for(int j=0; j<inter->num_altsetting; j++) {
    
    	            interdesc = &inter->altsetting[j];
    
    	            cout<<"Interface Number: "<<(int)interdesc->bInterfaceNumber<<" | ";
    
    	            cout<<"Number of endpoints: "<<(int)interdesc->bNumEndpoints<<" | ";
    
    	            for(int k=0; k<(int)interdesc->bNumEndpoints; k++) {
    
                            epdesc = &interdesc->endpoint[k];
    
    	                cout<<"Descriptor Type: "<<(int)epdesc->bDescriptorType<<" | ";
    
    	                cout<<"EP Address: "<<(int)epdesc->bEndpointAddress<<" | ";
    
    	            }
    
    	        }
    
    	    }
    
    	    cout<<endl<<endl<<endl;
    
    	    libusb_free_config_descriptor(config);
    
    	}
    

Anmelden zum Antworten