如何静态链接到 POCO C++ so 文件

How to statically link to a POCO C++ so file

本文关键字:POCO C++ so 文件 链接 何静态 静态      更新时间:2023-10-16

在Linux中,我正在尝试静态链接POCO C++库,以便我可以将生成的可执行文件分发到其他未安装POCO库的计算机。 我可以像这样编译我的源文件(一个简单的 gunzip 替换(:

$ g++ mygunzip.cpp  -L/usr/local/lib/ -lPocoFoundation

但是生成的可执行文件要求在执行它的机器中安装 PocoFoundation 库。 我不知道如何静态链接 PocoFoundation 库,以便不需要在目标设备上安装 POCO 库。 我已经尝试了这个和其他一些事情,但没有任何效果:

$ g++ -o mygunzip.o mygunzip.cpp -static  /usr/local/lib/libPocoFoundation.so.60
/usr/bin/ld: attempted static link of dynamic object `/usr/local/lib/libPocoFoundation.so.60'
collect2: error: ld returned 1 exit status

我以前没有深入研究过这种编译,所以任何指导都值得赞赏。

谢谢

更新我能够通过运行./configure --static, make, sudo make install来获取为 POCO 构建的静态库。 现在我有以下静态库:

$ sudo find /usr/local/lib/ -iname "*poco*a"
/usr/local/lib/libPocoJSON.a
/usr/local/lib/libPocoFoundationd.a
/usr/local/lib/libPocoUtild.a
/usr/local/lib/libPocoXMLd.a
/usr/local/lib/libPocoEncodingsd.a
/usr/local/lib/libPocoXML.a
/usr/local/lib/libPocoNet.a
/usr/local/lib/libPocoFoundation.a
/usr/local/lib/libPocoNetd.a
/usr/local/lib/libPocoJSONd.a
/usr/local/lib/libPocoEncodings.a
/usr/local/lib/libPocoUtil.a

但是我编译的代码似乎仍然没有静态链接,因为当我添加 -Bstatic 标志时没有区别。

$ g++ -o withoutStatic mygunzip.cpp  -L/usr/local/lib/ -lPocoFoundation
$ g++ -o withStatic mygunzip.cpp -Bstatic  -L/usr/local/lib/ -lPocoFoundation
$ g++ -o withStatic2 mygunzip.cpp -L/usr/local/lib/ -Bstatic -lPocoFoundation
$ md5sum with*
7b9374bb3f8772ed23db99090c269a84  withoutStatic
7b9374bb3f8772ed23db99090c269a84  withStatic
7b9374bb3f8772ed23db99090c269a84  withStatic2

答案我想我找到了解决方案:我用-l:libPocoFoundation.a代替-lPocoFoundation。 这导致了一个更大的可执行文件,我假设因为它包含静态 POCO 库:

$ g++ -o withStatic3 mygunzip.cpp -L/usr/local/lib/ -l:libPocoFoundation.a

除非您有可用的静态 (.a( 库,否则无法静态链接它。.so文件不能用于静态链接,它们只能用于动态链接。

此外,使用-static作为 gcc 的命令行参数可以静态链接所有内容,包括例如libstdc++,这可能不是您想要做的。如果只有您想要静态链接的 Poco 库,则需要提供链接器标志-Bstatic并围绕它-Bdynamic