我會做下列方式:
(如果有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