C++导出so的方法,以及extern C 注意事项
# c++中导出函数到so中给c调用
c++编译时会修改函数名,而c不会,所以c++导出的函数给c调用时,需要加上extern "C" 修饰符,使编译器不改名,这样c就可以正常调用了。
声明(.h)需要 extern "C"
extern "C" void foo();
1
定义(.cpp)也需要 extern "C"
extern "C" void foo(){
//do something.
}
1
2
3
2
3
如果so内部要调用该函数,那么其需要包含的声明(.h)也是
extern "C" void foo();
1
因为cpp会将函数改名,所以为了保持声明和定义一致,该函数的声明处加了extern C。该函数所有的声明和定义的地方都要加 extern C, 不加的话就是另一个函数了。
# C++中导出类或者函数到so中给C++调用
由于c++编译时改名的方式是相同的,所以导出时不要加extern C, 其他的C++调用时,直接用相同的名字调用就可以了。
编辑 (opens new window)
上次更新: 2023/05/07, 17:27:54