Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

C++ Bibliothek in C Programm einbinden

Empfohlene Antworten

Veröffentlicht

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

hm, muss ich dann das C-Projekt mit g++ compilieren oder geht es auch (theoretisch) mit gcc?

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

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" ')

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)

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() "

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.