2012-07-07 61 views
0
  1. 首先,我构建了需要通过编译/usr/local/boost_1_49_0/并运行bootstrap.sh来构建的Boost库。这没问题。
  2. 步骤(1)创造了/usr/local/boost_1_49_0/stage/lib
  3. 我测试链接到的库中的所有.so.a文件,说lboost_regex#include <boost/regex>在我的源代码。这也没有问题。
  4. 最后尝试对ASIO的例子,我想:C++链接增强库

    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 

回答

3

-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),告诉链接到哪里启动从其中变量被设置在外壳可执行文件时,搜索。

+0

刚想rpath的警告 - 不要做,如果你打算二进制文件运送到其他人(或其他机器)。跟踪rpath错误可能会非常棘手和痛苦。 – 2012-07-07 05:06:30

+0

但是,通过将$ ORIGIN嵌入到二进制文件的运行时路径中可以避免该问题。虽然$ ORIGIN路径仍然是易碎的,但它至少使搜索路径相对于“二进制位置在哪里”而不是系统上的特定位置。 – 2012-07-07 05:09:28

+0

@KevinGrant好的,谢谢你把问题整理出来。尽管没有什么像麻烦free --static flag – 2012-07-08 04:33:15