我会做下列方式:
(如果有MSVC的工作,忽视了GCC编译命令)
假设我有一个名为AAA一个C++类,在文件中AAA中定义.h,aaa.cpp,并且类AAA有一个名为sayHi(常量字符*名称),我想启用C代码。
类的C++代码AAA - 纯C++,我不修改它:
// AAA。ħ
#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;
}
编译此类作为定期对C++进行。这段代码“不知道”它将被C代码使用。使用命令:
g++ -fpic -shared aaa.cpp -o libaaa.so
现在,同样在C++,创建一个C连接器。在文件中定义它aaa_c_connector.h,aaa_c_connector.cpp。该连接器将定义一个C函数,命名为AAA_sayHi(cosnt字符*姓名),将使用的实例AAA,并调用其方法:
// 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
编译它,再次使用常规的C++编译命令:
g++ -fpic -shared aaa_c_connector.cpp -L. -laaa -o libaaa_c_connector.so
现在我有一个共享库(libaaa_c_connector.so),实现了C函数AAA_sayHi(为const char *名称)。我现在可以创建一个C主文件和编译它一起:
// main.c中
#include "aaa_c_connector.h"
int main() {
AAA_sayHi("David");
AAA_sayHi("James");
return 0;
}
使用C编译命令编译它:
gcc main.c -L. -laaa_c_connector -o c_aaa
我需要设置LD_LIBRARY_PATH包含$ PWD,如果我运行可执行./c_aaa,我会得到的输出我预计:
Hi David
Hi James
编辑:
在一些Linux发行版,-laaa
和-lstdc++
可能还需要进行最后的编译命令。感谢@AlaaM。注意事项
阅读http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.6 – jweyrich 2010-04-30 11:41:43
当您控制C++库时:http:// stackoverflow。 com/questions/12615683/calling-c-functions-from-c-file – 2015-05-29 10:10:50
可能出现[从C中优雅地调用C++]的副本(http://stackoverflow.com/questions/7281441/elegantly-call-c-from-c ) – user2284570 2017-03-13 22:48:26