boost - 您如何仅静态链接 Boost 库?

标签 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 中,我从 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 库都是静态链接而不是动态链接的。

最佳答案

使用 boost 存档文件 (.a 文件)而不是共享的 lib 文件(.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` 标志。

关于boost - 您如何仅静态链接 Boost 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5889815/

相关文章:

c++ - Qt 对 boost::system::generic_category() 的 undefined reference

java - java中static的使用

javascript - 如何链接(谷歌地图)infowindow 文本字符串?

ruby - 在 Ruby 中使用 Mechanize 提取链接

vim:添加可点击标签

c++ - 未定义对 boost::system::generic_category() 的引用,尽管库已提供给 g++

c++ - Rcpp 没有找到 Boost header

c++ - 加载 boost 的共享库时出错

java - 静态赋值调用该方法两次

java - 在单线程中多次调用静态方法