【问题标题】:C++ linking boost libraryC++ 链接 boost 库
【发布时间】:2012-07-07 04:51:17
【问题描述】:
  1. 首先我通过转到/usr/local/boost_1_49_0/ 并运行bootstrap.sh 来构建需要构建的Boost 库。一切顺利。
  2. 步骤(1)在/usr/local/boost_1_49_0/stage/lib中创建了所有.so.a文件
  3. 我测试了与库的链接,例如在我的源代码中lboost_regex#include <boost/regex>。这也没有问题。
  4. 最后在asio上试了一下例子,我试过了:

    g++ -I/usr/local/boost_1_49_0 MAIN.cpp -o MAIN -L/usr/local/boost_1_49_0/stage/lib -lboost_thread -lboost_system -lpthread
    

(4) 编译好了。但是当我使用./MAIN 运行程序时,出现以下错误:

./MAIN: error while loading shared libraries: libboost_system.so.1.49.0: cannot open shared object file: No such file or directory 

【问题讨论】:

    标签: c++ boost linker


    【解决方案1】:

    -L 选项仅设置编译时 库搜索路径;如果你想在运行时找到一个共享库,那么它的目录必须在运行时知道。

    使用g++ 设置它的一种方法是通过编译器将-rpath 传递给链接器;在您的情况下,您可以说-Wl,-rpath -Wl,/usr/local/boost_1_49_0/stage/lib。 (这会将目录嵌入到可执行文件中。)

    另一种方法是将库安装在链接器默认搜索的位置(例如,/usr/local/lib 可能是这样的位置,具体取决于系统的配置方式)。

    另一种方法是设置一个环境变量,例如LD_LIBRARY_PATH(Linux 或 Solaris)或DYLD_LIBRARY_PATH(Mac OS X),告诉链接器在从设置了变量的 shell 启动可执行文件时在哪里搜索.

    【讨论】:

    • 只是关于 rpath 的警告 - 如果您打算将二进制文件发送给其他任何人(或其他机器),请不要这样做。追踪 rpath 错误可能会很棘手而且很痛苦。
    • 这个问题可以通过在二进制文件的运行时路径中嵌入 $ORIGIN 来避免。虽然 $ORIGIN 路径仍然是可破坏的,但它至少使搜索路径相对于“二进制文件所在的位置”,而不是系统上的特定位置。
    • @KevinGrant 好的,感谢您解决了问题。虽然没有什么比无忧无虑的 - 静态标志
    【解决方案2】:

    您确定共享库位于加载程序可以找到的位置吗?将它放在系统范围的目录或与可执行文件相同的目录中。

    Here's a link with more information about the loader.

    【讨论】:

      猜你喜欢
      • 2011-08-22
      • 2012-05-03
      • 2013-01-23
      • 1970-01-01
      • 2017-05-14
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多