Veröffentlicht 9. März 201015 j 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
9. März 201015 j 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]
9. März 201015 j hm, muss ich dann das C-Projekt mit g++ compilieren oder geht es auch (theoretisch) mit gcc?
9. März 201015 j 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.
9. März 201015 j 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
9. März 201015 j 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.
9. März 201015 j 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" ')
9. März 201015 j 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)
9. März 201015 j also z.b. gcc ... -libstdc++ .. bla.o -o bla-lstdc++ ... weil bei mir funktioniert es grad nicht Siehe meine Signatur.
10. März 201015 j 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() "
10. März 201015 j 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
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.