C Datei mit C++ Datei verlinken



  • Hallo !
    Ich habe einen C++ Datei mit der ich jetzt ein C-Datei verlinken möchte.
    Jetzt meckert mein Dev-C++ Compiler mir die folgenden Fehler an:

    In function TTUIInit(int, char* [Linker error] undefined reference tocssl_start()'

    In function TTUIInit(int, char**)': [Linker error] undefined reference tocssl_open(char const*, void ()(int, unsigned char, int), int, int, int, int, int)'

    ld returned 1 exit status
    [ttgui] Error 1

    Was kann ich dagegen tun ?
    Muss ich irgendwas beachten beim Linken von C und C++ Dateien..??

    Desweitern habe ich noch einen Make File, indem ich dieses da stehen habe:

    cssl.o: cssl.c
    $(CC) -Wall -D_GNU_SOURCE -c cssl.c -o cssl.o $(CXXFLAGS)

    Was bedeutet das -Wall -D_GNU_SOURCE ??

    Ich bin dankbar für jede Hilfe...
    mfg macke_a



  • Hat nichts mit purem C++ zu tun ... davon abgesehen sollte -Wall für Warnings: all stehen ... d.h. er soll auch kleinigkeiten durch Warnungen hervorheben.



  • Muss man den Irgendetwas beachten, wenn ich eine C-Datei mit einer C++ Datei verlinke? Bei mir läuft das nicht. Binde ich die C-Datei mit einer anderen C-Datei zusammen, dann mekert der selbe Compiler nicht!!

    Ne Idee, was da los ist ?



  • C++ besitzt ein anderes Naming-Schema als C, um eben Klassen-Methoden und Parameter-Überladung zu erlauben. Daher musst du dem Compiler explizit sagen, das es sich bei den Funktionen um C-Funktionen handelt. Das geht mit extern "C" { }

    zB

    #ifdef __cplusplus
    extern "C" {
    #endif
    
      void cfunc();
    
    #ifdef __cplusplus
    }
    #endif
    

    (btw. Dev-C++ wird afaik nicht weiter entwickelt. Schau dir vielleicht mal Code::Blocks an. Das nutzt den gleichen Compiler wie Dev-C++)



  • Hi,

    die Linker-Fehlermeldung sieht aber nicht unbedingt nach einem name-mangeling-Problem aus.

    @macke_a: "Wierum" hast Du den Sprachwechsel:

    • cssl_start() und cssl_open() sind in C definiert und werden von einem C++-Modul aus aufgerufen ? oder:
    • cssl_start() und cssl_open() sind in C++ definiert und werden von einem C-Modul aus aufgerufen ?

    Im ersten Fall hast Du vermutlich ein Problem mit den Compile/Link-Parametern, sonst vermutlich tatsächlich das von rüdiger angesprochene Problem.

    Ich tippe allerdings auf Ersteres und darauf, dass Du die Implementierung der Funktionen dem Linker nicht zur Verfügung stellst (in Form einer lib oder eines obj).

    Gruß,

    Simon2.



  • @ Simon2

    Genau diesen Fall habe ich !!!!

    cssl_start() und cssl_open() sind in C definiert und werden von einem C++-Modul aus aufgerufen !

    In meinem Makefile(Ausschnitt)

    OBJ = ttgui.o CUIMYButton.o CUIMbt.o CUILed.o cssl.o $(RES)
    LINKOBJ = ttgui.o CUIMYButton.o CUIMbt.o CUILed.o cssl.o $(RES)

    cssl.o: cssl.c
    $(CC) -c cssl.c -o cssl.o $(-I/usr/local/include)

    stelle ich ihm die Objekt Datei zur Verfügung !

    Das ist alles schon geschehen!

    Erst hat er in meinem Pfad (-I/usr/local/include) die fcntl.h Header Datei n. gefunden!
    Jetzt habe ich diese nachträglich eingefügt !

    Jetzt erfolgt wieder eine Fehlermeldung:
    21:3 s:\local\include\fcntl.h #error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead."

    Obwohl ich in meiner cssl.c Datei
    #include <fcnthl.h> schreibe !!!

    Ich dreh durch, ich finde einfach den Fehler nicht !!!

    Gruss macke_a



  • Woher hast du denn die fcntl.h Datei, die du dort verwendet hast? zufällig aus dem Verzeichnis 'bits' rauskopiert?



  • Hallo !

    Es kann wohl sein, dass ich die Datei dort her habe so genau weis ich das nicht mehr! Kann das ein Problem sein ?

    Falls ja, wo bekomme ich sonst die Header Datei her ?

    Gruss macke_a



  • macke_a schrieb:

    Hallo !

    Es kann wohl sein, dass ich die Datei dort her habe so genau weis ich das nicht mehr! Kann das ein Problem sein ?

    Ja, das kann ein Problem sein - diese Datei erwartet nämlich offenbar, daß sie von einer anderen <fcntl.h> aus eingebunden wird, die einige Definitionen vorbereiten soll. (ja, sowas ist schlechtes Design - aber sag das mal dem Autor der fcntl.h ;))

    Falls ja, wo bekomme ich sonst die Header Datei her ?

    Wo hast du denn diese Version ursprünglich herbekommen?



  • macke_a schrieb:

    @ Simon2

    Genau diesen Fall habe ich !!!!
    ...

    Ach so, wenn Du die cssl.c selbst compilierst, musst Du sicherstellen, dass es dabei nicht zu name-mangeling kommt (sollte ein guter Designer der cssl.c zwar machen, aber leider ist das nicht immer der Fall).
    Ich würde mir mal das cssl.o mit einem Hexfähigen Editor ansehen. Wenn da "cssl_start" drinsteht, wird das mit C-Namenskonvention compiliert. Wenn dagegen der Name eher "_Z10cssl_startv" lautet, dann hat dort der C++-Compiler Signaturinformationen "reinge-mangle-d" und beim Linken des ttgui.o findet er das Symbol "cssl_start" natürlich nicht...

    Gruß,

    Simon2.


Anmelden zum Antworten