C library in C++ linken?



  • Hallo,
    wie der Titel schon sagt, möchte ich eine (meine) C library zu einem C++ Programm linken. Wie hoffentlich manche hier schon erfahren haben dürften, ist das nicht ganz nach Schema 'F' möglich, zumindest ist es mir nicht gelungen. Geht das nun? Wenn ja, wie?

    Danke,
    Massimo



  • Eigentlich ist das ganz einfach möglich. Du musst nur die Funktionen im C++-Teil als extern "C" deklarieren. Wenn du Headerdateien gemeinsam benutzen willst, kannst du auch auf das Makro __cplusplus testen, das definiert ist, wenn ein C++ Compiler arbeitet.



  • Bashar schrieb:

    Eigentlich ist das ganz einfach möglich. Du musst nur die Funktionen im C++-Teil als extern "C" deklarieren. Wenn du Headerdateien gemeinsam benutzen willst, kannst du auch auf das Makro __cplusplus testen, das definiert ist, wenn ein C++ Compiler arbeitet.

    Hast vielleicht nen URL für das? Hab zwar beides probiert, aber leider erfolglos..., wahrscheinlich aber falsch. Bekomme immer "undefined reference"-Meldungen. Ich baue die shared library mit gcc und dann mit g++ soll die in ein File kompiliert werden, was es aber leider nicht tut. Wo soll ich das extern C und/oder __cplusplus hinsetzen? In die (relevanten) Headerdateien?



  • naja ungefähr so:

    // foo.h ein Header, der von C und C++ gleichermassen benutzt wird
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    int funktion1(int, char*);
    char* funktion2(void);
    
    #ifdef __cplusplus
    }
    #endif
    
    /* Implementierung in C */
    #include "foo.h"
    int funktion1(int a, char * b) { ... }
    
    // Benutzen in C++
    #include "foo.h"
    int main() {
      char buf[20];
      int x = funktion1(20, buf);
    }
    

    extern "C" macht, dass das «Name-Mangling», also das Codieren der Argumenttypen zum Zwecke der Überladung, was der C++-Compiler standardmäßig durchführt, ausgeschaltet wird.



  • Vielen Dank! Mein Fehler war, dass ich am Ende des h-Files nur ein schlichtes #endif hatte.


Log in to reply