C语言调用C++的共享库SO
今天在项目中,遇到了一个问题,对方提供给我们一个.h的声明文件(使用的是cpp语言),和一个动态库so。但是我们项目中用的是C语言,我们如何来调用so库中的方法呢?我们都知道,C++在设计时,兼容C语言,可以直接调用C语言库中的接口,但是C语言调用C++的接口就会比较困难,比如C++中实现一个类,其中有方法func,那么C语言该怎么调用这个func呢?
// test.h
class A {
static int func(int a, int b);
};
// test.cpp(我们没有这个cpp文件,对方提供给的是so库)
int A::func(int a,int b) {
return a+b;
}
解决办法就是使用C++语言的extern "C"来告诉编译器,代码用C语言编译方式进行编译
// test_wrapper.h
extern "C" {
int func(int a, int b);
}
// test_wrapper.cpp
#include "test_wrapper.h"
#include "test.h"
int func(int a, int b) {
return A::func(a,b);
}
至此,我们做了一个包裹函数,将c++的源文件(so库,我们不知道具体实现),进行一个简单的封装,加上extern "C",使用C语言进行编译。将编译后的结果和原来的so库再次包装成一个新的so库,然后即可链接使用。编译新的so库的命令:
g++ -fPIC -shared libtest.so test_wrapper.cpp -o libtest_wrapper.so
得到libtest_wrapper.so动态库后
我们就可以将该动态库和test_wrapper.h交给其它C语言用户进行使用
标签:int,C++,C语言,so,wrapper,func,test,SO
From: https://www.cnblogs.com/xyfhsy/p/18181125