一、说明
最近在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 可执行文件就不再有链接错误。
六、总结
第五步的配置是经常会碰到的问题,是本次记录的一个重点。