C-Bibliothek in C++ benutzen



  • Hoi,

    ich habe folgendes Problem: vor einiger Zeit habe ich eine HTML-Template-Bibliothek in C geschrieben. Die will ich nun in einem C++-Programmbibliothek, die ich entwickle, benutzen. Die Header-Files der Template-Bibliothek enthalten alle

    #ifdef __cplusplus
    extern "C" {
    #endif
    
    // ... Definitionen
    
    #ifdef __cplusplus
    }  /* End of the 'extern "C"' block */
    #endif
    

    Ich benutze die Autotools, um die Makefile automatisch generieren zu lassen; die Bibliothek heisst libblblogmanagement. Der LIBADD-Eintrag in der Makefile.am sieht so aus:

    libblblogmanagement_la_LIBADD=-lsqlite3 -ltemplate
    

    Wie ihr seht, benutze ich ausserdem noch die libsqlite3. Die funktioniert auch einwandfrei... aber wenn ich jetzt die Template-Bibliothek benutze, bekomme ich folgende Fehlermeldung:

    ./.libs/libblblogmanagement.so: undefined reference to `tpl_error_message(s_template*)'
    ./.libs/libblblogmanagement.so: undefined reference to `tpl_new_template(s_template*, char const*)'
    ./.libs/libblblogmanagement.so: undefined reference to `tpl_evaluate(s_template*, _IO_FILE*)'
    

    Interessant ist, was ldd sagt:

    ckruse@skuld src $ ldd .libs/libblblogmanagement.so
            linux-gate.so.1 =>  (0xffffe000)
            libsqlite3.so.0 => /usr/lib/libsqlite3.so.0 (0xb7f6b000)
            libtemplate.so.0 => /usr/local/lib/libtemplate.so.0 (0xb7f51000)
            libstdc++.so.5 => //usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5-20050130/libstdc++.so.5 (0xb7e94000)
            libm.so.6 => /lib/libm.so.6 (0xb7e71000)
            libc.so.6 => /lib/libc.so.6 (0xb7d5d000)
            libgcc_s.so.1 => //usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5-20050130/libgcc_s.so.1 (0xb7d55000)
            libpthread.so.0 => /lib/libpthread.so.0 (0xb7d41000)
            /lib/ld-linux.so.2 (0x80000000)
    ckruse@skuld src $
    

    Erst, wenn die Bibliothek an das Programm gebunden werden soll, kommt es zu diesen Fehlern. Hat einer eine Idee, wie das sein kann? Was führt zu diesem Fehler und wie kann ich ihn vermeiden?

    Grüße,
    CK



  • ./.libs/libblblogmanagement.so: undefined reference to `tpl_error_message(s_template*)'

    Wenn so was kommt (also ein Funktionsname inkl. Parameter und Rückgabewert), dann wurde wohl nicht extern "C" verwendet.



  • Ringding schrieb:

    ./.libs/libblblogmanagement.so: undefined reference to `tpl_error_message(s_template*)'

    Wenn so was kommt (also ein Funktionsname inkl. Parameter und Rückgabewert), dann wurde wohl nicht extern "C" verwendet.

    Wird aber. Zitat aus libtemplate.h:

    #ifndef __LIBTEMPLATE_H
    #define __LIBTEMPLATE_H
    
    /*
     * Make sure we can call this stuff from C++.
     */
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    #define TPL_ERR_UNKNOWN_TOKEN_TYPE      -1
    #define TPL_ERR_DIVISION_BY_ZERO        -2
    #define TPL_ERR_THEN_MISSING            -3
    // ....
    
    #ifdef __cplusplus
    }  /* End of the 'extern "C"' block */
    #endif
    
    #endif
    
    /* eof */
    

    Du kannst dir die Header-Files (und auch die Source-Files) der libtemplate hier anschauen:

    http://cvs.sourceforge.net/viewcvs.py/libtemplate/libtemplate/

    Grüße,
    CK



  • Hallo,

    habe den Fehler gefunden; er war _sau_ blöd: ich hatte eine alte Installation von libtemplate.h in /usr/local, die hatte wohl Vorrang vor der Installation aus /usr/... ;-)) Jetzt geht es, danke für die Zeit & Mühe!

    Grüße,
    CK



  • Jaja, es ist fast immer sowas, wenn das Ding absolut nicht das tut, was man ihm sagt ;).


Anmelden zum Antworten