Ausführbare Datei aus icon_switch.c

Dieses Thema im Forum "C/C++" wurde erstellt von Athur Dent, 04.04.2007.

  1. #1 Athur Dent, 04.04.2007
    Athur Dent

    Athur Dent Handtuchhalter

    Dabei seit:
    08.12.2006
    Beiträge:
    662
    Zustimmungen:
    0
    Ort:
    Hannover
    Ich habe da ei Problem mit einer Datei Namens icon_switch.c, ich möchte diese Datei zu einer ausführbaren Anwendung machen.
    Jedoch bin ich leider des mächtigen C`s nicht mächtig.
    Deswegen habe ich gegoogelt und den Befehl:
    Code:
    gcc -o icon_switch icon_switch.c
    
    gefunden, herraus kam:
    Code:
    linux-silberfuchs:/usr/include # gcc -o icon_switch icon_switch.c
    /tmp/ccgZqirt.o: In function `release_usb_device':
    icon_switch.c:(.text+0x22): undefined reference to `usb_release_interface'
    icon_switch.c:(.text+0x49): undefined reference to `usb_close'
    /tmp/ccgZqirt.o: In function `find_device':
    icon_switch.c:(.text+0x9a): undefined reference to `usb_get_busses'
    /tmp/ccgZqirt.o: In function `main':
    icon_switch.c:(.text+0x1be): undefined reference to `usb_init'
    icon_switch.c:(.text+0x1c3): undefined reference to `usb_find_busses'
    icon_switch.c:(.text+0x1c8): undefined reference to `usb_find_devices'
    icon_switch.c:(.text+0x200): undefined reference to `usb_open'
    icon_switch.c:(.text+0x262): undefined reference to `usb_get_driver_np'
    icon_switch.c:(.text+0x292): undefined reference to `usb_detach_kernel_driver_np'
    icon_switch.c:(.text+0x2dd): undefined reference to `usb_claim_interface'
    icon_switch.c:(.text+0x329): undefined reference to `usb_set_altinterface'
    icon_switch.c:(.text+0x3b3): undefined reference to `usb_bulk_write'
    icon_switch.c:(.text+0x3eb): undefined reference to `usb_release_interface'
    icon_switch.c:(.text+0x419): undefined reference to `usb_close'
    collect2: ld returned 1 exit status
    
    jetzt hab ich mir die Datei genauer angeschaut und die Abhängigkeiten:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    #include <signal.h>
    #include <ctype.h>
    #include <usb.h>
    
    gefunden, danach gesucht, brachte unter anderem den Ordner /usr/include/ (waren mehrere Ordner) hervor. Dann habe ich die Datei icon_switch.c in diesen Ordner bzw. auch in /usr/src/linux kopiert und in beiden Ordnern versucht die Datei zu kompilieren -> gleiche Ergebnis.
    Mit gcc --help habe ich dann erfahren das ich mit -B einen Pfad angeben kann aber
    Code:
    gcc -B /usr/include -o icon_switch icon_switch.c
    
    brachte aber immer noch das gleiche Ergebniss.

    Hier die ganze icon_switch.c von Josua Dietze
    Code:
     /*
      Mode switcher for Option Icon 3G+ USB box
    
      Copyright (C) 2006  Josua Dietze  (digidietze nospam t-online spamno de)
    
      Triggers the switching of the box from storage device mode
      to modem (serial) device mode.
    
      Created with help from usbsnoop2libusb.pl (http://iki.fi/lindi/usb/usbsnoop2libusb.pl)
    
      Version 0.2, 2006/09/25
        Code cleaning, more messages
      Version 0.1, 2006/09/24
        Just very basic/*
      Mode switcher for Option Icon 3G+ USB box
    
      Copyright (C) 2006  Josua Dietze  (digidietze nospam t-online spamno de)
    
      Triggers the switching of the box from storage device mode
      to modem (serial) device mode.
    
      Created with help from usbsnoop2libusb.pl (http://iki.fi/lindi/usb/usbsnoop2libusb.pl)
     functionality ...
    
    
      This program is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published by
      the Free Software Foundation; either version 2 of the License, or
      (at your option) any later version.
    
      This program is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      GNU General Public License for more details:
    
      http://www.gnu.org/licenses/gpl.txt
    
    */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    #include <signal.h>
    #include <ctype.h>
    #include <usb.h>
    
    struct usb_dev_handle *devh;
    
    void release_usb_device(int dummy) {
        int ret;
        printf("Program cancelled by system. Bye\n\n");
        ret = usb_release_interface(devh, 0);
        if (!ret)
    	printf(" Oops, failed to release interface: %d\n", ret);
        usb_close(devh);
        if (!ret)
    	printf(" Oops, failed to close interface: %d\n", ret);
        printf("\n");
        exit(1);
    }
    
    struct usb_device *find_device(int vendor, int product) {
        struct usb_bus *bus;
        struct usb_device *right_dev;
        right_dev = NULL;
        
        printf("Looking for Option Icon USB 3G+ box ...\n");
        for (bus = usb_get_busses(); bus; bus = bus->next) {
    	struct usb_device *dev;
    	
    	for (dev = bus->devices; dev; dev = dev->next) {
    	    if (dev->descriptor.idVendor == vendor && dev->descriptor.idProduct == product) {
    		right_dev = dev;
    	    }
    	    if (dev->descriptor.idVendor == 0x0af0 && dev->descriptor.idProduct == 0x6600) {
    	        printf("Found box in modem mode. Switching not necessary. Bye\n\n");
    		exit(0);		
    	    }
    	}
        }
        if (right_dev != NULL)
    	printf("Found box in storage mode. Preparing for switching ...\n");
        else {
    	printf("No Option Icon box found. Is it connected? Bye\n\n");
    	exit(0);
        }
        return right_dev;
    }
    
    int main(int argc, char **argv) {
        int ret;
        int vendor = 0x05c6;
        int product = 0x1000;
    
        struct usb_device *dev;
        char buf[65535];
    
        printf("\n * icon_switch: tool for changing USB mode of Option Icon 3G+ box\n");
        printf(" * (C) Josua Dietze 2006\n");
        printf(" * Works with libusb 0.1.12 and probably other versions\n\n");
    
        usb_init();
        usb_find_busses();
        usb_find_devices();
    
        dev = find_device(vendor, product);
        assert(dev);
    
        devh = usb_open(dev);
        assert(devh);
        
        signal(SIGTERM, release_usb_device);
    
        printf("Looking for active storage driver ...\n");
        ret = usb_get_driver_np(devh, 0, buf, sizeof(buf));
        if (ret == 0) {
    	printf(" OK, driver found (\"%s\"), attempting to detach it ...\n", buf);
    	ret = usb_detach_kernel_driver_np(devh, 0);
    	if (ret == 0)
        	    printf(" OK, driver \"%s\" successfully detached\n", buf);
    	else
        	    printf(" Oops, driver \"%s\" detach failed with error %d. Trying to continue ...\n", buf, ret);
        } else {
            printf("No driver found. Box was not initialized. Can't communicate. Bye\n\n");
    	exit(1);
        }
        ret = usb_claim_interface(devh, 0);
        if (ret != 0) {
    	printf("Could not claim interface (error %d). Can't communicate. Bye\n\n", ret);
    	exit(1);
        }
        
        ret = usb_set_altinterface(devh, 0);
        assert(ret >= 0);
     
     
        memcpy(buf, "\x55\x53\x42\x43\x70\x6e\xde\x86\x00\x00\x00\x00\x00\x00\x06\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 0x000001f);
        ret = usb_bulk_write(devh, 0x00000005, buf, 0x000001f, 1000);
        if (ret >= 0 )
    	printf("Device change command successfully sent. Box probably switched.\nLook at /var/log/syslog for result ... Bye\n\n");
        else
    	printf("Device change command returned error %d", ret);
     
        ret = usb_release_interface(devh, 0);
        assert(ret == 0);
    
        ret = usb_close(devh);
        assert(ret == 0);
    
        return 0;
    }
    
    Meine Frage ist jetzt, wie kann ich die Datei kompilieren und wie mache ich das mit den Abhängigkeiten?

    Mir ist bekannt, das ich diese Datei auch schon kompiliert saugen kann, es geht aber um Werte ändern (in der Datei) und den gennerellen Ablauf.
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. hehejo

    hehejo blöder Purist

    Dabei seit:
    12.10.2003
    Beiträge:
    1.280
    Zustimmungen:
    0
    Ort:
    Stein (Mittelfranken)
    Also du hast die Datei nicht nur kompiliert sondern auch gelinkt.

    Komplieren wäre "gcc -c icon_switch.c". Das liefert dir dann eine icon_switch.o welche du dann mit bestimmten Flags und Libraries linken kannst: "gcc -o icon_switch icon_switch.o -lXYZ".
    Hier würde jetzt libXYZ mit hinzugelinkt.

    Ich gehe mal schwer davon aus, dass dieser Code eine Library benutzt. Finde raus, welche das ist und versuch es dann mit -lNAME_ohne_lib.
     
  4. #3 Athur Dent, 04.04.2007
    Athur Dent

    Athur Dent Handtuchhalter

    Dabei seit:
    08.12.2006
    Beiträge:
    662
    Zustimmungen:
    0
    Ort:
    Hannover
    leider noch nicht ganz, ja Du hast recht es wird die libusb erwähnt, was auch sinn macht, da es ja um USB - Hardware geht aber:
    installiert: libusb-0.1.12-27 und
    libusb-32bit-o.1.12-27

    Code:
    linux-silberfuchs:/usr/src/linux # gcc -o icon_switch icon_switch.c -|usb-32bit
    bash: usb-32bit: command not found
    gcc: -E or -x required when input is from standard input
    linux-silberfuchs:/usr/src/linux # gcc -o icon_switch icon_switch.c -|usb-0.1.12-27
    bash: usb-0.1.12-27: command not found
    gcc: -E or -x required when input is from standard input
    linux-silberfuchs:/usr/src/linux # gcc -o icon_switch icon_switch.c -|usb-0.1.12
    bash: usb-0.1.12: command not found
    gcc: -E or -x required when input is from standard input
    linux-silberfuchs:/usr/src/linux # gcc -o icon_switch icon_switch.c -|usb
    bash: usb: command not found
    gcc: -E or -x required when input is from standard input
    linux-silberfuchs:/usr/src/linux #
    
     
  5. #4 Atomara, 04.04.2007
    Atomara

    Atomara Debrandeter User

    Dabei seit:
    06.03.2004
    Beiträge:
    1.255
    Zustimmungen:
    0
    Ort:
    Deutschland , Nrw , Münsterland
    für sowas ist die quick and dirty lösung am besten suche nach der usb.h
    und trage dann in die datei statt #include <usb.h>

    #include </pfad/zur/datei/usb.h>
     
  6. #5 Athur Dent, 04.04.2007
    Athur Dent

    Athur Dent Handtuchhalter

    Dabei seit:
    08.12.2006
    Beiträge:
    662
    Zustimmungen:
    0
    Ort:
    Hannover
    ich kann leider nur sagen wer lesen kann ist klar im vorteil.
    Nchdem ich mir die man gcc nochmal anschaute und mit dem Wissen von hehejo verband änderte sich der Code auf:
    Code:
    linux-silberfuchs:/usr/src/linux # gcc -o icon_switch icon_switch.c -lusb
    linux-silberfuchs:/usr/src/linux #    
    
    und lieferte mir das erwünschte Ergebnis.
    | und l (L) ist halt doch ein unterschied.

    was ich mal wieder vergaß,
    Danke
     
  7. musiKk

    musiKk Dr. Strangelove

    Dabei seit:
    30.07.2006
    Beiträge:
    264
    Zustimmungen:
    0
    Ort:
    Leipzig
    Auch wenn das Problem schon geloest zu sein scheint nur noch eine kleine Klugscheisserei: Wenn man einen Header in einem speziellen Pfad includen will, muss man die spitzen Klammern durch double quotes ersetzen. Also hier #include "/pfad/zur/datei/usb.h". Nimmt man die spitzen Klammern, wird die Datei im Standard-Include-Verzeichnis gesucht.
     
  8. #7 eldariel, 09.08.2007
    eldariel

    eldariel Grünschnabel

    Dabei seit:
    09.08.2007
    Beiträge:
    3
    Zustimmungen:
    0
    Hallo,

    ich habe eben mal den Thread hier gefunden, da ich vor dem gleichen Problem stehe. Ich versuche eine Vodafone Easybox unter Debian zu installieren. Doch habe ich leider Probleme beim Umwandeln der icon_switch.c. Ich habe die Punkte wie hier beschrieben versucht, doch schmeißt mir der Compiler einige Fehlermeldungen raus beim kompilieren :(

    Mit c kann ich leider nur wenig anfangen :/ Könnte mir dabei vielleicht jemand helfen? Komme einfach nicht weiter.

    Code:
    machine:/usr/local/bin# gcc -o icon_switch icon_switch.c -lusb
    icon_switch.c: In function ‘find_device’:
    icon_switch.c:60: warning: assignment makes pointer from integer without a cast
    icon_switch.c:60: error: dereferencing pointer to incomplete type
    icon_switch.c:63: error: dereferencing pointer to incomplete type
    icon_switch.c:63: error: dereferencing pointer to incomplete type
    icon_switch.c:64: error: dereferencing pointer to incomplete type
    icon_switch.c:64: error: dereferencing pointer to incomplete type
    icon_switch.c:67: error: dereferencing pointer to incomplete type
    icon_switch.c:67: error: dereferencing pointer to incomplete type
    icon_switch.c: In function ‘main’:
    icon_switch.c:101: warning: assignment makes pointer from integer without a cast
    
    Meine icon_switch.c sieht so aus:
    Code:
    /*
      Mode switcher for Option Icon 3G+ USB box
    
      Copyright (C) 2006  Josua Dietze  (digidietze nospam t-online spamno de)
    
      Triggers the switching of the box from storage device mode
      to modem (serial) device mode.
    
      Created with help from usbsnoop2libusb.pl ([url]http://iki.fi/lindi/usb/usbsnoop2libusb.pl[/url])
    
      Version 0.2, 2006/09/25
        Code cleaning, more messages
      Version 0.1, 2006/09/24
        Just very basic functionality ...
    
    
      This program is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published by
      the Free Software Foundation; either version 2 of the License, or
      (at your option) any later version.
    
      This program is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      GNU General Public License for more details:
    
      [url]http://www.gnu.org/licenses/gpl.txt[/url]
    
    */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    #include <signal.h>
    #include <ctype.h>
    #include "/usr/include/linux/usb.h"
    
    struct usb_dev_handle *devh;
    
    void release_usb_device(int dummy) {
        int ret;
        printf("Program cancelled by system. Bye\n\n");
        ret = usb_release_interface(devh, 0);
        if (!ret)
    	printf(" Oops, failed to release interface: %d\n", ret);
        usb_close(devh);
        if (!ret)
    	printf(" Oops, failed to close interface: %d\n", ret);
        printf("\n");
        exit(1);
    }
    
    struct usb_device *find_device(int vendor, int product) {
        struct usb_bus *bus;
        struct usb_device *right_dev;
        right_dev = NULL;
        
        printf("Looking for Option Icon USB 3G+ box ...\n");
        for (bus = usb_get_busses(); bus; bus = bus->next) {
    	struct usb_device *dev;
    	
    	for (dev = bus->devices; dev; dev = dev->next) {
    	    if (dev->descriptor.idVendor == vendor && dev->descriptor.idProduct == product) {
    		right_dev = dev;
    	    }
    	    if (dev->descriptor.idVendor == 0x0af0 && dev->descriptor.idProduct == 0x6600) {
    	        printf("Found box in modem mode. Switching not necessary. Bye\n\n");
    		exit(0);		
    	    }
    	}
        }
        if (right_dev != NULL)
    	printf("Found box in storage mode. Preparing for switching ...\n");
        else {
    	printf("No Option Icon box found. Is it connected? Bye\n\n");
    	exit(0);
        }
        return right_dev;
    }
    
    int main(int argc, char **argv) {
        int ret;
        int vendor = 0x05c6;
        int product = 0x1000;
    
        struct usb_device *dev;
        char buf[65535];
    
        printf("\n * icon_switch: tool for changing USB mode of Option Icon 3G+ box\n");
        printf(" * (C) Josua Dietze 2006\n");
        printf(" * Works with libusb 0.1.12 and probably other versions\n\n");
    
        usb_init();
        usb_find_busses();
        usb_find_devices();
    
        dev = find_device(vendor, product);
        assert(dev);
    
        devh = usb_open(dev);
        assert(devh);
        
        signal(SIGTERM, release_usb_device);
    
        printf("Looking for active storage driver ...\n");
        ret = usb_get_driver_np(devh, 0, buf, sizeof(buf));
        if (ret == 0) {
    	printf(" OK, driver found (\"%s\"), attempting to detach it ...\n", buf);
    	ret = usb_detach_kernel_driver_np(devh, 0);
    	if (ret == 0)
        	    printf(" OK, driver \"%s\" successfully detached\n", buf);
    	else
        	    printf(" Oops, driver \"%s\" detach failed with error %d. Trying to continue ...\n", buf, ret);
        } else {
            printf("No driver found. Box was not initialized. Can't communicate. Bye\n\n");
    	exit(1);
        }
        ret = usb_claim_interface(devh, 0);
        if (ret != 0) {
    	printf("Could not claim interface (error %d). Can't communicate. Bye\n\n", ret);
    	exit(1);
        }
        
        ret = usb_set_altinterface(devh, 0);
        assert(ret >= 0);
     
     
        memcpy(buf, "\x55\x53\x42\x43\x70\x6e\xde\x86\x00\x00\x00\x00\x00\x00\x06\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 0x000001f);
        ret = usb_bulk_write(devh, 0x00000005, buf, 0x000001f, 1000);
        if (ret >= 0 )
    	printf("Device change command successfully sent. Box probably switched.\nLook at /var/log/syslog for result ... Bye\n\n");
        else
    	printf("Device change command returned error %d", ret);
     
        ret = usb_release_interface(devh, 0);
        assert(ret == 0);
    
        ret = usb_close(devh);
        assert(ret == 0);
    
        return 0;
    }
    
    Muss ich da irgendwas in der source Datei umschreiben? oder habe ich nur wieder irgendwas falsch gemacht? Hoffe mir kann da einer helfen :/

    Greetz eldariel
     
  9. keks

    keks nicht 1337 genug

    Dabei seit:
    17.01.2007
    Beiträge:
    401
    Zustimmungen:
    0
    Ort:
    Hessen
    Hallo,

    ist die libusb installiert?

    Code:
    dpkg -l |grep libusb
    
     
  10. #9 eldariel, 09.08.2007
    eldariel

    eldariel Grünschnabel

    Dabei seit:
    09.08.2007
    Beiträge:
    3
    Zustimmungen:
    0
    Code:
    ii  libusb-0.1-4                      0.1.12-5                        userspace USB programming library
    
    sry, hatte ich vergessen zu sagen. Ja libusb ist installiert. Allerdings habe ich wenig Ahnung, wie 2 unterschiedliche Versionen gleichzeitig installiert sein können. Bin noch relativ frisch unter Linux ^^
     
  11. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  12. #10 SkydiverBS, 09.08.2007
    Zuletzt bearbeitet: 09.08.2007
    SkydiverBS

    SkydiverBS Tripel-As

    Dabei seit:
    15.01.2005
    Beiträge:
    207
    Zustimmungen:
    0
    Ort:
    Freising
    Hi!

    War diese Zeile schon so oder hast du sie geändert? Falls ja, dann ersetzte die Zeile wieder durch die ursprüngliche Zeile: wahrscheinlich
    Code:
    #include <usb.h>
    Es gibt nämlich unter Umständen mehrere unterschiedliche usb.h Dateien auf deinem System und nur mit einer funktioniert dieses Programm.

    Außerdem solltest du noch das Paket libusb-dev installieren, weil dieses die entsprechende usb.h (/usr/include/usb.h) enthält.

    Versuche nun nochmal das Programm zu kompilieren.
     
  13. #11 eldariel, 10.08.2007
    eldariel

    eldariel Grünschnabel

    Dabei seit:
    09.08.2007
    Beiträge:
    3
    Zustimmungen:
    0
    Vielen Dank! :) libusb-dev hat den Unterschied gemacht. Nun ist die Datei kompiliert und ausführbar :D Dickes Danke.

    (hatte die Headerdatei mit Direktpfad eingebunden, weil sie vorher nicht gefunden wurde)
     
Thema:

Ausführbare Datei aus icon_switch.c

Die Seite wird geladen...

Ausführbare Datei aus icon_switch.c - Ähnliche Themen

  1. Ausführbare C-Datei von Mac OS auf Embedded Linux ausführen

    Ausführbare C-Datei von Mac OS auf Embedded Linux ausführen: Hallo, für eine wissenschaftliche Arbeit beschäftige ich mich mit einem Embedded Linux Rechner, auf welchem ich eine meiner C-Datein zum laufen...
  2. Neue ausführbare Datei mit Datensätzen aus einer Datei und Variablen erstellen

    Neue ausführbare Datei mit Datensätzen aus einer Datei und Variablen erstellen: Hallo erstmal allesamt. Mein erster Beitrag hier. Ich habe in letzter Zeit eigentlich nur Batch-Scripte, HTML etc. geschrieben und nie shells....
  3. Suche in Datei doppelte Wörter in jeder Zeile bis zum dritten Leerzeichen...

    Suche in Datei doppelte Wörter in jeder Zeile bis zum dritten Leerzeichen...: Ich habe eine Textdatei in der ich Einträge bis zum 3. Leerzeichen mit den restlichen Zeilen (auch nur bis 3. Leerzeichen) vergleichen muss und...
  4. Alle Dateien eines Verzeichnisses mit einer anderen Datei vergleichen

    Alle Dateien eines Verzeichnisses mit einer anderen Datei vergleichen: Hallo, ich habe ein Verzeichnis, darin enthalten sind mehrere Dateien. Nun möchte ich alle Dateien (Parameter $1) gegen eine konstante Datei...
  5. Dateiinhalte vergleichen - Neue Sätze dann ausgeben

    Dateiinhalte vergleichen - Neue Sätze dann ausgeben: Liebe Forumsmitglieder, ich benöte mal wieder Eure Hilfe: Ich möchte 2 Dateien vergleichen. Datei-1 hat z.B. 100 Datensätze mit mehreren Feldern...