Shamharoth Geschrieben 9. März 2010 Geschrieben 9. März 2010 Hallo zusammen. Ich bin schon die ganze Zeit am schauen, find jedoch nichts gscheids. Ausgangssituation (C/C++ - Programmierung unter Linux/Eclipse): Ich habe eine staatische Klasse geschrieben (nennen wir sie mal lib.a) und diese besitzt eine funktion (.. libfunc() ) Jetzt möchte ich gerne, dass diese funktion in sowohl C als auch C++ Programme genutzt werden kann. Über diese Funktion werden dem Umständen entsprechend andere Funktionen aufgerufen, die die Übergabevariablen als wstring bekommen (Wegen UTF ... ) und verarbeiten. Die Funktion libfunc(...) habe ich so geschrieben, dass der Input als char* übergeben wird und diese an die interne Funktionen als wstring übergibt (nach 2maliger Konvertierung in string un dann wstring). Zudem wird ein Boolscher Wert von den internen Funktionen bis ganz nach aussen abgefeuert. Wie kann ich nun die Lib so einstellen, dass ich diese auch mit dem C programm laufen lassen kann? Zwar hab ich vereinzelt Treffer gefunden die über "extern "C"" gingen, haben jedoch nicht funktioniert, da warsch. diese einträge zudem um cpp-dateien in einem c projekt gingen. Danke im voraus Zitieren
Klotzkopp Geschrieben 9. März 2010 Geschrieben 9. März 2010 Du musst libfunc als extern "C" definieren. Leider kann ein C-Compiler mit extern "C" nichts anfangen, also musst du diesen Teil zumindest im Header für C ausblenden: #ifdef __cplusplus extern "C" #endif // hier deine Funktionsdeklaration[/CODE] Zitieren
Shamharoth Geschrieben 9. März 2010 Autor Geschrieben 9. März 2010 hm, muss ich dann das C-Projekt mit g++ compilieren oder geht es auch (theoretisch) mit gcc? Zitieren
Klotzkopp Geschrieben 9. März 2010 Geschrieben 9. März 2010 hm, muss ich dann das C-Projekt mit g++ compilieren oder geht es auch (theoretisch) mit gcc? Wenn du ein C-Projekt mit g++ compilierst, ist es kein C mehr. Zitieren
Shamharoth Geschrieben 9. März 2010 Autor Geschrieben 9. März 2010 mit extern C hab ich schon viel rumprobiert. ich habe es momentan so gemacht (jetzt genauer als 1. Post) Libprojekt ->.cpp - Datei mit libfunc() mit include auf header der funktionen (nächste zeile) ->.cpp - Datei mit funktionen c++projekt ->.cpp - Datei mit der Mainfunktion ->.h - Datei mit Deklaration der libfun() ->.a - compilierte libdatei (FUNKTIONIERT) cprojekt ->.c - Datei mit der Mainfunktion ->.h - Datei mit Deklaration der libfun() ->.a - compilierte libdatei (fuktioniert nicht) Wenn ich mit gcc kompilieren will (habe eine eigene makefile an der es nicht liegen kann) kommen unter anderem folgende Fehler: src/inputchecker.cpp:147: undefined reference to `std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::operator[](unsigned int)' src/inputchecker.cpp:147: undefined reference to `std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::operator[](unsigned int)' src/inputchecker.cpp:147: undefined reference to `std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::operator[](unsigned int)' hier der header, der im c-projekt auf die funktion in der library zeigen soll: #ifdef __cplusplus extern "C" { #endif bool InputCheck(char* Input, char* Type); #ifdef __cplusplus } #endif hier die funktionsdefinition in der library: #ifdef __cplusplus extern "C" { #endif bool InputCheck(char* Input, char* Type){ return InputChecker(Input,Type); } #ifdef __cplusplus } #endif Zitieren
Klotzkopp Geschrieben 9. März 2010 Geschrieben 9. März 2010 Wenn ich mit gcc kompilieren will (habe eine eigene makefile an der es nicht liegen kann) kommen unter anderem folgende Fehler: Die Fehlermeldungen kommen aus C++-Quellcode. Du kannst natürlich nur das C-Projekt mit GCC kompilieren. Zitieren
Shamharoth Geschrieben 9. März 2010 Autor Geschrieben 9. März 2010 Die Fehlermeldungen kommen aus C++-Quellcode. Du kannst natürlich nur das C-Projekt mit GCC kompilieren. jopp das is verständlich. jedoch versteh ich nicht warum er da rummeckert :/ laud meiner makefile bleibt er in seinem projektordner. das sind die zwei kompilierungsanweisungen, die die makefile ausführt: gcc -g -c -Wall -Wshadow -Wbad-function-cast -Wsign-compare -Wcast-align -Iinclude/ src/tester.c -o objs/tester.o gcc -g -lm -lrt objs/tester.o lib/libinputchecker.a -o prog meine lib habe ich ja sogar in den ordner kopiert und die makefile nutzt die .a file ja auch zum linken. ... was ich auch grade seh spuckt er als ersten Fehler lib/libinputchecker.a(inputchecker_c.o).eh_frame+0x11): undefined reference to `__gxx_personality_v0' aus. im inputchecker_c.o steht nur die Funktion, die für C und C++ genutzt werden soll (die funktion mit 'extern "C" ') Zitieren
Klotzkopp Geschrieben 9. März 2010 Geschrieben 9. März 2010 Versuch bitte mal, libstdc++ dazuzulinken. Zitieren
Shamharoth Geschrieben 9. März 2010 Autor Geschrieben 9. März 2010 hmmm norm. weisse sollte der es einfach als linkflag hinzugefügt werden können, oder? also z.b. gcc ... -libstdc++ .. bla.o -o bla ... weil bei mir funktioniert es grad nicht (obwohl libstdc++6 installiert ist auf dem system) Zitieren
Klotzkopp Geschrieben 9. März 2010 Geschrieben 9. März 2010 also z.b. gcc ... -libstdc++ .. bla.o -o bla-lstdc++ ... weil bei mir funktioniert es grad nicht Siehe meine Signatur. Zitieren
Shamharoth Geschrieben 10. März 2010 Autor Geschrieben 10. März 2010 Danke erstmal. Jetzt kompiliert er (Habe nur falsch den Flag gesetzt). Jedoch habe ich jetzt ein kleines Problem im Code. Eclipse meckert bei einer strcpy funktion. Ich habe ein String sInput und ein char Pointer auf ein char Array cInput. Jetzt wollte ich den Inhalt von String in Char Koppieren: strcpy(cInput,sInput.c_str()); Im C++ Code funktioniert dieser, beim C Programm meint jedoch wenn ich die Anweisung debugge: No source available for "strcpy() " Zitieren
Shamharoth Geschrieben 10. März 2010 Autor Geschrieben 10. März 2010 Ich hab jetzt weitr drann rumgetestet und mir ist aufgefallen, dass ich ein Element von dem Übergebenen Pointer / Array verändere, wird der Pointer/Array im C programm NICHT geändert. ... strange o_O ich habe jedoch auch als Überparameter char* cInput stehen. und cInput[0]='X' hat keine Auswirkung auf die übergeordneten Funktionen. hmm seltsam :/ manche posts haben einen "ändern" button, manche nicht Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.