在 linux 中编译/链接多个 c++ 库

Posted

技术标签:

【中文标题】在 linux 中编译/链接多个 c++ 库【英文标题】:Compiling/Linking multiple c++ libraries in linux 【发布时间】:2017-07-06 05:45:27 【问题描述】:

我有 3 个没有依赖关系的独立库,它们自己专有,使用 g++ -c 单独编译,然后使用 ar rvs *.o 单独添加到单独的存档中。

我现在有 3 个独立的档案。

我现在有另一个依赖于所有 3 个以前的库的第 4 个库。如何编译我的第 4 个库以包含其他 3 个专有库,以在 main.cpp 程序中使用所有 4 个(仅引用第 4 个库)?

我是一个 g++/linux/makefile 完全初学者。

【问题讨论】:

将这些目标文件放入第四个库的编译命令中。 g++ -c lib4.cpp lib1.o lib2.o lib3.o 然后编译 main 与所有 4 使用 g++ main.cpp lib1.o lib2.o lib3.o lib4.o "[then] ... 使用ar rvs *.o...添加到单独的存档中 - 确保在存档上运行ranlib 以生成索引。 我以为 s 选项会创建索引? 【参考方案1】:

第四个库是静态库还是动态库?

前三个库是静态库,它们只不过是目标文件的存档。如果是第四个库,那么您无需对其进行任何操作,只需创建存档即可。

问题在于链接 与第四个库。由于静态库只不过是目标文件的存档,因此您需要与所有四个库链接。您还需要在链接器的命令行上正确放置库:如果库 A 依赖于库 B,则 A 需要在链接器命令行上 B 之前。

另一方面如果第四个库是一个共享库,那么它就像一个可执行程序一样被链接,并且当你这样做时,你会像往常一样链接所有需要的库。那么在使用共享库创建程序时,就不需要链接依赖了。


对于实际的命令行,最简单的方法是在链接时添加库:

$ g++ main.o -o my_program lib4.a lib3.a lib2.a lib1.a

以上命令用于链接静态库,并在创建main.cpp源的目标文件之后。

【讨论】:

以上是关于在 linux 中编译/链接多个 c++ 库的主要内容,如果未能解决你的问题,请参考以下文章

Linux 动态链接库(.so)的使用

C++ 链接错误与 Linux 上的多个定义

Linux中C++编译使用动态链接库

C++ Ubuntu。使用 FFMPEG 库编译的多个未定义引用 [关闭]

linux--GCC用法

C++ 常用命令行开发工具(Linux)