C++项目在Linux下编译动态库

一、说明

最近在Windows下开发了一个C++线程池项目,准备移植到Linux下,并且编译成动态库进行使用。现将具体过程在此记录。

二、准备

1、项目文件

我的项目文件如下,其中除main.cpp是测试文件之外,其他都是线程池项目相关的

将C++文件移动到Linux中:

2、编译器

要有C++编译器,并适配自己代码中的C++标准。比如我项目中使用了C++17标准,那么所用的g++编译器的版本也要能够支持C++17。如下图,使用g++ -v 可以查看当前编译器版本。

 三、编译

使用命令:

g++ -fPIC -shared threadpool.cpp -o libtdpool.so -std=c++17
  • -fPIC: 这个选项告诉编译器生成位置无关的代码(Position Independent Code)。这对于生成动态链接库(shared libraries)是必须的,因为动态链接库可以在内存中的任何位置被加载。

  • -shared: 这个选项指示编译器生成一个动态链接库(shared object file),而不是一个可执行文件。

  • threadpool.cpp: 这是要编译的源文件。

  • -o libtdpool.so-o 选项后面跟的是输出文件的名称。在这里,输出文件是一个名为 libtdpool.so 的动态链接库。.so 是 Linux 系统上动态链接库的常用扩展名。

  • -std=c++17: 这个选项指定了使用 C++17 标准来编译代码。这意味着编译器会支持 C++17 引入的所有新特性和语法。 

编译完成后查看目录,出现了 libtdpool.so 文件,说明编译成功。现在就不需要threadpool.cpp文件了。

四、移动文件

 Linux中,系统会自动去/usr/local/lib/文件夹中寻找动态库,去/usr/local/include/目录下寻找头文件,所以要将它们移动过去,注意要使用sudo权限。

动态库文件在下图最后一个位置:

所有头文件也在如下目录中:

 五、配置

此时,其他项目还不能直接使用我们准备好的库,虽然能够进行编译,也能够编译出.out文件,但是在运行时会报错:

 这个报错表示运行过程中找不到.so库,这是因为,编译阶段和运行阶段找库的路径是不同的。

在编译阶段会去/usr/local/lib/ 或者 /usr/lib/ 下找,这一阶段我们已经处理好。

在运行阶段,会去 /etc/ld.so.cache 这个缓存文件下找,我们不修改这个缓存文件,但是我们可以通过操作其同目录下的.conf文件

 .conf文件内容:

内容只有一行,表示include .conf.d目录下的所有 .conf文件。我们可以去看下目录下有什么:

 目录下包含几个.conf文件,其中有我刚刚新建的mylib.conf,并在其中将libtdpool.so的路径放进去:

 

这样再使用命令 ldconfig 刷新刚写的.conf文件,将其中的路径全部刷新到前文提到的ld.so.cache文件中。

至此运行 a.out 可执行文件就不再有链接错误。

 六、总结

第五步的配置是经常会碰到的问题,是本次记录的一个重点。

  • 26
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值