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

时间:2018-06-20 19:24:40

标签: c++ compilation poco-libraries

在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

1 个答案:

答案 0 :(得分:1)

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

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