C代码调用C++编译的so库

c++ c++ 2200 人阅读 | 0 人回复

发表于 2023-2-25 10:22:21 | 显示全部楼层 |阅读模式

先准备好公共部分的代码和工作

C调用C++的so库,中间需要一个中间接口库,然后普及一下知识点,不管动态库是动态调用还是静态调用,都不能像静态库一样,把库的接口编译到可执行文件中

准备好C++库
  1. //world.cpp
  2. #include <iostream>

  3. void world()
  4. {
  5.   std::cout << "world" << std::endl;
  6. }
复制代码
编译并cp到系统库目录下
cdiaoyognc  so.png

中间接口库的装备
  1. //mid.cpp
  2. #include <iostream>
  3. void world();
  4. #ifdef __cplusplus
  5. extern "C" {   //  即使这是一个C++程序,下列这个函数的实现也要以C约定的风格来搞!
  6. #endif
  7.    void m_world()
  8.   {
  9.     world();
  10.   }
  11. #ifdef __cplusplus
  12. }
  13. #endif
复制代码
动态调用C++库
  1. #include <stdio.h>
  2. #include <dlfcn.h>
  3. int main()
  4. {
  5.         void* handle = dlopen("./libmid.so", RTLD_LAZY);
  6.         void (*fun)();
  7.         fun = dlsym(handle, "m_world");
  8.         fun();
  9.         dlclose(handle);
  10.    return 0;
  11. }
复制代码
gcc.png

静态调用C++库
  1. #include <stdio.h>
  2. #include <dlfcn.h>
  3. void m_world();
  4. int main()
  5. {
  6.         m_world();
  7.    return 0;
  8. }
复制代码
gcc2.png


也可以这样指定绝对路径
  1. gcc test.c -lmid -o test -L./
  2. //大L指定路径,小l指定库名,这种使用方法,有时会显示找不到库,需要配置库路径环境变量
  3. //export LD_LIBRARY_PATH="data/chenxiaohui/SIFT3D-1.4.6-Linux/usr/local/lib/sift3d:$LD_LIBRARY_PATH"
  4. 或者gcc test.c -o test /usr/lib/libmid.so
  5. //直接路径+名字
  6. 注意事项:如果在板子上运行的话,可以用export LD_LIBRARY_PATH声明库的路径比如mount,nfs在/mnt,把库放到/mnt里面然后export LD_LIBRARY_PATH="/mnt:$LD_LIBRARY_PATH"就可以让程序找到了
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则