C++ Funktionalität für ein C - Programm wrappen
-
Hi!
Leider passt die Frage in das C- und in das C++ Forum
Hab mich jetzt aber mal für das hier entschieden.
Ich habe ein paar Klassen, die ich in einem C-Programm verwenden muss. Dafür habe ich die ganze Funktionalität in einem CPP - File in normale Funktionen gewrappt (d.h. mit einem Internen Objekt, das die benötigte Funktionalität komplett abdeckt)
So sind halt so Funktionen wie Init(), etc vorhanden. Jetzt möchte ich diese Funktionen gerne in meinem c-Programm verwenden.
Hierfür habe ich einfach mal alle Sachen in ein Testprojekt (Visual Studio 6) eingefügt, ne main.c gebaut und die Init() - Funktion aufgerufen.
Dabei bekomme ich dann leider einen Linkerfehler. Mach ich aus der main.c eine main.cpp dann funktioniert es.
Jetzt stellt sich die Frage wie ich das ganze am Besten möglich machen kann. ein extern "C" weg oder dergleichen fällt glaub ich aus. (Zumindest funktioniert es hier nicht)
Sollte ich es evtl in eine lib oder dll packen?
Oder wie geht man an so etwas heran?
Vielen Dank im voraus,
Thomas
-
Erklär nochmal genauer:
du hast eine Klasse in C++ geschrieben und würdest diese gerne in ein C Projekt einbinden?
Dann musst du einen Wrapper schreiben, der nur Funktionen anbietet. Dieser ist in C++ geschrieben, weil er intern C++ Code verwenden muss.
Nun musst du aber extern "C" verwenden, weil du ja kein name mangling willst, denn du willst diesen C++ Code ja von C aus aufrufen.
hab ich es richtig verstanden?
-
Shade Of Mine schrieb:
hab ich es richtig verstanden?
So wie ich das sehe schon, er will ne Klasse in C verwenden, und das sollte doch - egal ob .cpp, .obj, .lib oder .dll - nicht klappen
-
Hallo!
Ja, genau. Ich habe ein paar Klassen aus einem SDK für spezielle Anforderungen an meine IG Software. Die IG selbst ist jedoch komplett in C entwickelt. Jetzt muss ich natürlich diese Funktionalität in C anbieten. Das habe ich gemacht.
* CPP / H Files vom SDK
1 CPP / H File für meinen Wrapperdann hab ich halt noch * C - Files in meinem C Projekt.
Jetzt include ich das H - File meines Wrappers im C-Projekt. die CPP Files hab ich auch dazugeworfen, das compiled soweit.
Rufe ich jetzt allerdings ganz normal eine Funktion meines Wrappers auf, bekomme ich ein unresolved external.
main.obj : error LNK2001: Nichtaufgeloestes externes Symbol _AutocalibWrapper_LoadMeshFromFile
Release/aclibtest.exe : fatal error LNK1120: 1 unaufgeloeste externe VerweiseFüge ich ein extern "C" in mein H - File des Wrappers ein, bekomme ich jedoch auch wieder Fehler...
D:\dev\aclibtest\AutocalibWrapper.h(11) : error C2059: Syntaxfehler : 'string'
D:\dev\aclibtest\main.c(39) : warning C4013: 'AutocalibWrapper_Init' undefiniert; Annahme: extern mit Rueckgabetyp int
Fehler beim Ausführen von cl.exe.Mach ich um das extern "C" wie gewohnt ein #ifdef _cplusplus usw rein, dann bekomme ich wieder die unresolved externals.
Das .H file include ich in meinem main.c Test-File.
Das sieht ungefähr so aus:
#include "AutocalibWrapper.h" void main() { AutocalibWrapper_Init(0, 0); }
Mit den besagten Fehlern....
-Thomas
-
so kannste funktionen in .cpp dateien aufrufen
// beispiel: cpp datei #include <iostream> extern "C" void c_funktion_in_cpp_datei (void) { std::cout << "hello, CPP" << std::endl; }
// beispiel: c datei extern void c_funktion_in_cpp_datei (void); int main() { c_funktion_in_cpp_datei(); return 0; }
-
Gast221212 schrieb:
Shade Of Mine schrieb:
hab ich es richtig verstanden?
So wie ich das sehe schon, er will ne Klasse in C verwenden, und das sollte doch - egal ob .cpp, .obj, .lib oder .dll - nicht klappen
Wenn er einen Wrapper schreibt, dann schon.
mfg
v R