C語(yǔ)言程序調(diào)用C++庫(kù)函數(shù)方法,關(guān)鍵是函數(shù)名字解析問(wèn)題。 其實(shí)實(shí)現(xiàn)起來(lái)不是很難。
使用關(guān)鍵字 extern \"C\" 可以使得C++編譯器生成的函數(shù)名滿(mǎn)足C語(yǔ)言的要求
例子如下:
鏈接庫(kù)頭文件:
//head.h
class A
{
public:
A();
virtual ~A();
int gt();
int pt();
private:
int s;
};
.cpp
//firstso.cpp
#include <iostream>
#include \"head.h\"
A::A(){}
A::~A(){}
int A::gt()
{
s=10;
}
int A::pt()
{
std::cout<<s<<std::endl;
}
編譯命令如下:
g++ -shared -o libmy.so firstso.cpp
這時(shí)候生成libmy.so文件,將其拷貝到系統(tǒng)庫(kù)里面:/usr/lib/
進(jìn)行二次封裝:
.cpp
//secso.cpp
#include <iostream>
#include \"head.h\"
extern \"C\"
{
int f();
int f()
{
A a;
a.gt();
a.pt();
return 0;
}
}
編譯命令:
gcc -shared -o sec.so secso.cpp -L. -lmy
這時(shí)候生成第二個(gè).so文件,此時(shí)庫(kù)從一個(gè)類(lèi)變成了一個(gè)c的接口.
拷貝到/usr/lib
下面開(kāi)始調(diào)用:
//test.c
#include \"stdio.h\"
#include \"dlfcn.h\"
#define SOFILE \"sec.so\"
int (*f)();
int main()
{
void *dp;
dp=dlopen(SOFILE,RTLD_LAZY);
f=dlsym(dp,\"f\");
f();
return 0;
}
編譯命令如下:
gcc -rdynamic -s -o myapp test.c
運(yùn)行Z$./myapp
10
$