2011-05-04 163 views
4

我有一个项目,链接到各种常见的图书馆,以及Boost。在我自己以外的计算机上进行测试已被证明是困难的,因为各种版本的Linux都带有不同版本的Boost。我宁愿避免在每台机器上下载和编译相同版本的Boost。你如何静态链接Boost库?

有没有一种方法可以将我的程序静态链接到Boost库,并且一切正常?我尝试过将静态链接(静态),但这会导致其他问题(即找不到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 

EDIT(液):

COUNT0提到的正是我一直在寻找。在Eclipse中,我从Project - > Properties - > C/C++ Build - > Settings - > GCC C++ Linker - > Libraries - > Libraries(-l)中删除了所有Boost库(例如boost_system)。然后,我在Project - > Properties - > C/C++ Build - > Settings - > GCC C++ Linker - > Miscellaneous - > Other Objects下添加了Boost .a文件(例如/usr/lib/libboost_system.a)。我还从链接器标志中删除了“-static”。这产生了一个可执行文件,所有的boost库都是静态链接的,而不是动态链接的。

回答

6

只需使用boost存档文件(.a文件)而不是共享lib文件(即.so也就是用-l链接)。您现在正在动态链接这些boost库。写出来可能有助于确保什么是链接的静态和动态什么

这将是这个样子:

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

这就是我一直在寻找的东西!我只是删除了 -static“并添加了.a文件。 – JuiceboxHero 2011-05-04 21:53:39

+0

这是正确的 - 静态必须去,我的坏。 – count0 2011-05-05 14:15:56

0

这个错误表明你的连接器没有找到GL库,这与boost没有任何关系。

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

+0

矿位于:'/ usr/lib中/ libGL.so' – karlphillip 2011-05-04 21:07:00

+0

是的,先生,这是安装。当动态链接时,一切正常。但是当我将那个静态标志放在那里时,它会因上述错误而失败。这就是为什么我想静态链接Boost而不用担心lGL。 – JuiceboxHero 2011-05-04 21:24:13

+0

如果它安装在系统上,将编译路径添加到库中,它将变成如下所示:'-L/usr/lib -lGL' – karlphillip 2011-05-04 21:26:28