在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
答案 0 :(得分:1)
除非您有可用的静态(.a)库,否则无法与其静态链接。 .so
文件不可用于静态链接,只能用于动态链接。
此外,使用-static
作为gcc的命令行参数可以使其静态链接所有内容,例如libstdc++
,这可能不是您想要的去做。如果您只是要静态链接的Poco库,则需要在其周围提供链接器标志-Bstatic
和-Bdynamic
。