先准备好公共部分的代码和工作 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"就可以让程序找到了
复制代码
|