5

可能重复:
我可以在链接时混合使用静态库和共享对象库吗?

我想编译我的应用程序,只静态链接 boost_system 库。其他(glibc 等)应动态链接。我该怎么做?

我的动态编译命令:

g++  -o newserver  server.cpp ... -lboost_system -std=c++0x

静态编译命令:

g++ -static  -o newserver  server.cpp ... -pthread -lboost_system -std=c++0x

但是这个命令是静态链接的!应用程序的重量增加了 2mb!

你能告诉我什么命令只静态编译boost lib吗?

谢谢!

4

2 回答 2

8

替换-lboost_system-Wl,-Bstatic -lboost_system -Wl,-Bdynamic。该-Wl选项按照它在命令行中出现的顺序将它之后的东西发送到链接器。

于 2013-01-30T13:39:35.353 回答
2

有两种解决方案。您可以在命令行中指定-Bstatic-Bdynamic每个都会影响它后面的所有库。或者,您可以将要静态链接的库的静态版本安排在包含动态版本的目录之前搜索的目录中。这使您可以做出某种全局决策:您创建一次目录,并且-L在一般之前为它 执行的所有用户都-L将使用静态版本。

在实践中,我想不出你想要静态链接 Boost 库的情况,所以最简单的解决方案可能只是删除.so文件。g++ 唯一一次做出决定(并考虑-Bstatic and -Bdynamic)是它是否在同一目录中找到两者。它以给定的顺序搜索目录,当它找到具有库的静态或动态版本的目录时,它会停止。如果只存在一个版本,则无论如何都会使用该版本。

于 2013-01-30T13:43:45.583 回答