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"就可以让程序找到了
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I&You

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值