你如何静态链接Boost库?

时间:2011-05-04 21:01:48

标签: boost static hyperlink

我有一个项目链接各种常见的库,以及Boost。由于各种版本的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中,我删除了所有Boost库(例如,boost_system)表单Project - >属性 - > C / C ++ Build - >设置 - > GCC C ++链接器 - >图书馆 - >图书馆(-l)。然后我在Project - >下添加了Boost .a文件(例如/usr/lib/libboost_system.a)。属性 - > C / C ++ Build - >设置 - > GCC C ++链接器 - >其他 - >其他物件。我还从链接器标志中删除了“-static”。这产生了一个可执行文件,其中所有的boost库都是静态链接而不是动态链接。

2 个答案:

答案 0 :(得分:7)

使用boost 存档文件(.a文件)代替共享库文件(.so aka。链接-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`标志。

答案 1 :(得分:0)

该错误表明您的链接器未找到GL库,这与boost无关。

确保您的系统上安装了libgl1-mesa-dev或同等软件包。