如何在静态库中正确链接g++

How do I correctly link in static libraries with g++?

本文关键字:链接 g++ 静态      更新时间:2023-10-16

我正在尝试进行一个相当复杂的构建,但对于这个问题,我会稍微简化一下。我有三个c++文件(main.cpp file2.cpp和file3.cpp),我正试图编译它们,并将它们链接到3个静态库(libx.a-liby.z-libz.a)以生成可执行文件。

涉及到许多依赖关系。

所有三个c文件都依赖于所有三个库。libx依赖于liby和libz。最后,libx还依赖于file2.cpp.中包含的几个回调函数

什么命令行可以正确地构建它?我已经尝试了几十种变体,但还没有什么能让链接器满意。

如果重要的话,lib是用gcc编译的纯c代码。源代码是c++,我正在用g++编译/链接。作为一个visualstudio项目,我已经正确地完成了这项工作,并且正在尝试移植到linux。

来自您的帖子:

g++ main.cpp file2.cpp file3.cpp -lx -ly -lz

但是,如果静态链接给您带来了问题,或者您需要分发任何库,那么您可以考虑使它们成为共享对象.so文件,通常称为DSO)。在这种情况下,例如,当您构建libx.a时,将所有源编译为对象文件,然后将它们与组合

g++ -shared *.o -o libx.so -ly -lz

(此版本假设liby.alibz.a仍然是静态的,并将合并为libx.so

您可能需要在.cpp文件中使用extern "C" { }来包含C库的头。

请参阅如何混合C和C++中的在C++中包含C标头。