Ich würde es auf folgende Weise tun:
(Wenn mit MSVC arbeiten, ignorieren Sie die GCC Kompilation Befehle)
Nehmen wir an, ich habe eine C++ Klasse mit dem Namen AAA, definiert in Dateien aaa .h, aaa.cpp, und dass die Klasse AAA eine Methode namens sayHi (const char * name) hat, die ich für C-Code aktivieren möchte.
Der C++ Code der Klasse AAA - Pure C++, ich nicht ändern es:
// aaa.h
#ifndef AAA_H
#define AAA_H
class AAA {
public:
AAA();
void sayHi(const char *name);
};
#endif
// aaa.cpp
#include <iostream>
#include "aaa.h"
AAA::AAA() {
}
void AAA::sayHi(const char *name) {
std::cout << "Hi " << name << std::endl;
}
diese Klasse kompilieren, wie regelmäßig für C++ getan. Dieser Code "weiß nicht", dass er von C-Code verwendet wird. Mit dem Befehl:
g++ -fpic -shared aaa.cpp -o libaaa.so
nun auch in C++, C-Anschluss zu schaffen. Definieren in Dateien aaa_c_connector.h, aaa_c_connector.cpp. Dieser Anschluss wird eine C-Funktion definieren, (Name cosnt char *) AAA_sayHi namens, die eine Instanz von AAA wird verwenden und wird seine Methode aufrufen:
// aaa_c_connector.h
#ifndef AAA_C_CONNECTOR_H
#define AAA_C_CONNECTOR_H
#ifdef __cplusplus
extern "C" {
#endif
void AAA_sayHi(const char *name);
#ifdef __cplusplus
}
#endif
#endif
// aaa_c_connector.cpp
#include <cstdlib>
#include "aaa_c_connector.h"
#include "aaa.h"
#ifdef __cplusplus
extern "C" {
#endif
// Inside this "extern C" block, I can define C functions that are able to call C++ code
static AAA *AAA_instance = NULL;
void lazyAAA() {
if (AAA_instance == NULL) {
AAA_instance = new AAA();
}
}
void AAA_sayHi(const char *name) {
lazyAAA();
AAA_instance->sayHi(name);
}
#ifdef __cplusplus
}
#endif
es Kompilieren wieder Befehl eines regulären C++ Compilation mit:
g++ -fpic -shared aaa_c_connector.cpp -L. -laaa -o libaaa_c_connector.so
Jetzt habe ich eine Shared Library (libaaa_c_connector.so), die die C-Funktion implementiert AAA_sayHi (const char * name). Ich kann jetzt eine C Haupt-Datei erstellen und kompilieren sie alle zusammen:
// main.c
#include "aaa_c_connector.h"
int main() {
AAA_sayHi("David");
AAA_sayHi("James");
return 0;
}
Kompilieren eine C Kompilation Befehl:
gcc main.c -L. -laaa_c_connector -o c_aaa
Ich muss eingestellt LD_LIBRARY_PATH enthalten $ PWD, und wenn ich die ausführbare Datei ausführen ./c_aaa, werde ich den Ausgang ich erwarten:
Hi David
Hi James
EDIT:
Auf einigen Linux-Distributionen, -laaa
und -lstdc++
auch für den letzten Kompilierung Befehl erforderlich. Danke an @AlaaM. für die Aufmerksamkeit
lesen http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.6 – jweyrich
Wenn steuern Sie die C++ Bibliothek: http: // Stackoverflow. com/questions/12615683/aufrufende-c-functions-from-c-datei –
Mögliches Duplikat von [Elegant Call C++ aus C] (http://stackoverflow.com/questions/7281441/elegantly-call-c-from-c) – user2284570