如何仅静态链接Boost库?

9
我有一个项目涉及到多个常见库,以及Boost。在不同的Linux电脑上测试这个项目变得困难,因为各种版本的Linux都配备了不同版本的Boost。我希望避免在每台电脑上下载和编译相同版本的Boost。
是否有一种方法只将我的程序静态链接到Boost库,并使其他一切正常链接?我尝试了静态链接所有内容(-static),但这会导致其他问题(即lGL未找到)。是否有其他潜在的方法,我可以仅打包必要的动态库与我的程序(例如与可执行文件位于同一文件夹中),并以这种方式分发它?
静态链接所有内容时出现的链接错误:
g++ -static -o"acmserver"  ./src/acmserver.o ./src/airplane.o ./src/bullet.o ./src/control.o ./src/detail.o ./src/game.o ./src/gamelog.o ./src/gamelogitem.o ./src/guns.o ./src/map.o ./src/missile.o ./src/missilepod.o ./src/object.o ./src/server.o   -lboost_system -lboost_filesystem -lboost_thread -lboost_serialization -lboost_date_time -lpthread -lGLU -lGL
/usr/bin/ld: cannot find -lGL
collect2: ld returned 1 exit status
make: *** [acmserver] Error 1

修改(解决方案):

count0提到了我所需要的。在Eclipse中,我从“项目-》属性-》C / C ++构建-》设置-》GCC C ++链接器-》库-》库(-l)”中删除了所有Boost库(例如boost_system)。然后,在“项目-》属性-》C / C ++构建-》设置-》GCC C ++链接器-》其他对象”下添加了Boost .a文件(例如/usr/lib/libboost_system.a)。我还从链接器标志中删除了“-static”。这将产生一个可执行文件,其中所有boost库都是静态链接的,而不是动态链接的。

2个回答

8

使用boost归档文件(.a文件)代替共享库文件(.so,也称为链接-l)。您目前正在动态链接这些boost库。将其写出来可能有助于确保静态链接和动态链接的内容。

示例:

g++ -o"acmserver"  ./src/acmserver.o ... ./src/server.o \
  /usr/local/lib/libboost_system.a /usr/local/lib/boost_filesystem \
  ... -lGL ...

根据gcc版本或平台类型的不同,您可能还需要添加-static标志。


2
这正是我正在寻找的!我只需要移除 "static" 并添加 .a 文件。 - JuiceboxHero
1
好的,请将它从被接受的答案中删除,以便未来的访问者;) - Jeff

0

这个错误提示说明你的链接器没有找到GL库,这与boost无关。

请确保你的系统上安装了libgl1-mesa-dev或等效的软件包。


我的位于:/usr/lib/libGL.so - karlphillip
是的先生,它已经安装好了。在动态链接时,一切都运行良好。但是当我加入-static标志时,它会出现上述错误。这就是为什么我想要静态链接Boost而不用担心lGL的原因。 - JuiceboxHero
如果在系统上安装了它,请将库的路径添加到编译行中,它将变成这样:-L/usr/lib -lGL - karlphillip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接