C代码调用C++编译的so库
最后会用动态跟静态分别调用,先准备好公共部分的代码和工作
C调用C++的so库,中间需要一个中间接口库,然后普及一下知识点,不管动态库是动态调用还是静态调用,都不能像静态库一样,把库的接口编译到可执行文件中
准备好C++库
//world.cpp
#include <iostream>
void world()
{
std::cout << "world" << std::endl;
}
编译并cp到系统库目录下
中间接口库的装备
//mid.cpp
#include <iostream>
void world();
#ifdef __cplusplus
extern "C" { // 即使这是一个C++程序,下列这个函数的实现也要以C约定的风格来搞!
#endif
void m_world()
{
world();
}
#ifdef __cplusplus
}
#endif
动态调用C++库
#include <stdio.h>
#include <dlfcn.h>
int main()
{
void* handle = dlopen("./libmid.so", RTLD_LAZY);
void (*fun)();
fun = dlsym(handle, "m_world");
fun();
dlclose(handle);
return 0;
}
静态调用C++库
#include <stdio.h>
#include <dlfcn.h>
void m_world();
int main()
{
m_world();
return 0;
}
也可以这样指定绝对路径
gcc test.c -lmid -o test -L./
//大L指定路径,小l指定库名,这种使用方法,有时会显示找不到库,需要配置库路径环境变量
//export LD_LIBRARY_PATH="data/chenxiaohui/SIFT3D-1.4.6-Linux/usr/local/lib/sift3d:$LD_LIBRARY_PATH"
或者gcc test.c -o test /usr/lib/libmid.so
//直接路径+名字
注意事项:如果在板子上运行的话,可以用export LD_LIBRARY_PATH声明库的路径比如mount,nfs在/mnt,把库放到/mnt里面然后export LD_LIBRARY_PATH="/mnt:$LD_LIBRARY_PATH"就可以让程序找到了