C++ Libs in C verwenden
-
Hi,
habe folgendes Problem, ich möchte in C++ eine library erzeugen, die ich dann in C nutzen kann.
Habe mich nun schon ettlich lange durchs Netz gewühlt, aber ich komme nicht weiter.Was habe ich nun versucht ?
zuerst lege ich folgende Dateien an:
try.hpp
#ifdef __cplusplus extern "C" #endif int tryit();
try.cpp
#include <iostream> #include "try.hpp" extern "C" int tryit() { std::cout << " + " << std::endl; }
tryit.c
#include "try.hpp" int main(int argc, char** argv) { tryit(); return 0; }
Dann wird kompiliert und die Bibliothek erzeugt
g++ -c try.cpp ar rs libtry.a try.o
Nun sollte folgende Befehl meine tryit (C-only) kompilieren
gcc -L. tryit.c -ltry
Aber da meckert es immer los
Das komische, wenn ich anstatt 'gcc' mal g++ nehme gehts natürlich,
aber das ist ja nicht der Sinn, dann habe ich ja wieder c++Ich will die c++ lib in c einbinden,
das muss doch irgendwie gehen...HILFE !
-
C ist nicht aufwärtskompatibel zu C++, daher kannst Du keine in C++ erstellten Libraries zu einer C-Sourcedatei hinzulinken. In deinem Fall nimmst Du auch noch C++ IO-Streams her, die Du dann in C versuchst, auszuführen. C allerdings kennt keine C++ IO-Streams, weswegen sich der Compiler beschwert.
Btw:, extern "C" ist für den genau entgegengesetzten Fall, also wenn du von C++ aus auf Funktionen aus einer C-Library zugreifen möchtest. Nicht so wie in Deinem.
Die einzige Möglichkeit, die Du hast, ist, den C++ Code als eine DLL zu kompilieren, und die dann in Deinem C-Projekt zu importieren, und die entsprechenden Funktionen aufzurufen.
-
hm komisch,
genau das wird aber beim folgenden Link und auch auf anderen Seiten behauptet:
http://developers.sun.com/solaris/articles/mixing.html#cpp_from_cvor allem dachte ich so ein library ist schon kompiliert....
-
Fabster schrieb:
genau das wird aber beim folgenden Link und auch auf anderen Seiten behauptet:
Ups sorry, dann war das gerade natürlich Mist, was ich Dir erklärt habe, davon wusste ich noch nichts. Ich nehme alles wieder zurück.
Fabster schrieb:
vor allem dachte ich so ein library ist schon kompiliert....
In dem Fall hast Du Recht, eine Library ist bereits vorkompiliert.
Ich gehe mal davon aus, dass wahrscheinlich Deine Compilerparameter falsch sind, der Code macht so auf den ersten Blick einen richtigen Eindruck. Kenne mich mit den Parametern leider nicht aus, aber in einer IDE müsstest du jede Sourcedatei einem Projekt hinzufügen, damit auch sie auch der Linker finden kann.
Was noch hilfreich wäre, ist, wenn Du die exakte Fehlermeldung posten würdest.
-
mikey schrieb:
Ups sorry, dann war das gerade natürlich Mist, was ich Dir erklärt habe, davon wusste ich noch nichts. Ich nehme alles wieder zurück.
ich meinte ja nur weil ich schon ellenlange suche und immer wieder lese das es geht, kA vllt ist das auch Murks;
mir kams logisch vor, dass ich nach dem kompillieren nen Maschinencode habe, den ich ab vom Compiler nutzen kannmikey schrieb:
Kenne mich mit den Parametern leider nicht aus, aber in einer IDE müsstest du jede Sourcedatei einem Projekt hinzufügen, damit auch sie auch der Linker finden kann.
hab keine IDE
ich sitze hier an meinem Linux-Rechner in der Uni
aber ich denke die Sourcen sind alle richtig beigefügtmikey schrieb:
Was noch hilfreich wäre, ist, wenn Du die exakte Fehlermeldung posten würdest.
try.cpp:7:2: warning: no newline at end of file /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crt1.o: In function `_start': (.text+0x18): undefined reference to `main' /tmp/cccseCYv.o: In function `__static_initialization_and_destruction_0(int, int)': try.cpp:(.text+0x23): undefined reference to `std::ios_base::Init::Init()' /tmp/cccseCYv.o: In function `__tcf_0': try.cpp:(.text+0x6c): undefined reference to `std::ios_base::Init::~Init()' /tmp/cccseCYv.o: In function `tryit': try.cpp:(.text+0x83): undefined reference to `std::cout' try.cpp:(.text+0x88): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' try.cpp:(.text+0x90): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)' try.cpp:(.text+0x98): undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))' /tmp/cccseCYv.o:(.eh_frame+0x11): undefined reference to `__gxx_personality_v0' collect2: ld returned 1 exit status
-
Fabster schrieb:
try.cpp
#include <iostream> #include "try.hpp" // include für errno ergänzen extern "C" int tryit() { std::cout << " + " << std::endl; }
Besser macht man das so, da es keinerlei Garantien gibt, das C Code mit den C++ Exceptions zurecht kommt.
#include <iostream> #include "try.hpp" extern "C" int tryit() { try { std::cout << " + " << std::endl; } catch(...) { errno = -1; // fehlercode entsprechend setzen } }
Ich will die c++ lib in c einbinden,
das muss doch irgendwie gehen...Von Hand "-LPfad -lstdc++" ergänzen, für Pfad den richtigen einsetzen. Der g++ weiß wo sich die libstdc++ befindet, da braucht man sie nie explizit anzugeben, was beim C Compiler notwendig ist.
HILFE !
[/quote]
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Compiler- und IDE-Forum verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
~john schrieb:
Von Hand "-LPfad -lstdc++" ergänzen, für Pfad den richtigen einsetzen. Der g++ weiß wo sich die libstdc++ befindet, da braucht man sie nie explizit anzugeben, was beim C Compiler notwendig ist.
FREU ---- das geht
vielen Dank !