C-Bibliothek in C++ benutzen
Christian Kruse
- programmiertechnik
你们好,
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 $
Die Bindung an die libblblogmanagement.so geschieht also anscheinend
problemlos. 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?
再见,
克里斯蒂安
你们好,
ich habe den Fehler gefunden: ich hatte eine alte Installation der
libtemplate in /usr/local. Die hatte wohl mehr vorrang als die Installation
in /usr/... ;-)) Also: es geht jetzt, danke für die Mühe, die evntl.
aufgebracht wurde.
再见,
克里斯蒂安
Hallo Christian.
Also: es geht jetzt, danke für die Mühe, die evntl.
aufgebracht wurde.
Da ist es schon so selten, mal einen eigenen Thread von dir zu lesen und dann löst du das Problem auch gleich noch selbst. ;-)
Gruß, Ashura
你好 Ashura,
Da ist es schon so selten, mal einen eigenen Thread von dir zu lesen und
dann löst du das Problem auch gleich noch selbst. ;-)
Hehe, tut mir leid, das nächste mal halte ich mich zurück *g*
再见,
克里斯蒂安
Hi,
ich habe den Fehler gefunden: ich hatte eine alte Installation der
libtemplate in /usr/local. Die hatte wohl mehr vorrang als die Installation
in /usr/... ;-)) Also: es geht jetzt, danke für die Mühe, die evntl.
aufgebracht wurde.
Kontrollier mal die Umgebungsvariablen LIB, LIBINC, INCLUDE usw.
cu,
Andreas
你好 MudGuard,
Kontrollier mal die Umgebungsvariablen LIB, LIBINC, INCLUDE usw.
Die sind schon richtig gesetzt. Es ist ja gewünscht, dass /usr/local /usr
überschreibt. Ich wusste halt nicht, dass da noch eine alte Version liegt :)
再见,
克里斯蒂安