【问题标题】:boost and cpp-netlib make compile ERRORboost 和 cpp-netlib 使编译错误
【发布时间】:2011-05-09 07:30:59
【问题描述】:

[已解决] 创建了从 /usr/lib/lib/* 到 /usr/lib* 的符号链接

[更新 3] 新版本:

好的,我想我解决了一些问题

使用find / -name "libboost_system.*" 出局是

/usr/include/boost/lib/libboost_system.so
/usr/include/boost/lib/libboost_system.a
/usr/include/boost/lib/libboost_system.so.1.46.1
/usr/lib/lib/libboost_system.so
/usr/lib/lib/libboost_system.a
/usr/lib/lib/libboost_system.so.1.46.1
/usr/local/include/boost_1_46_1/bin.v2/libs/system/build/gcc-4.4.3/release/link-static/threading-multi/libboost_system.a
/usr/local/include/boost_1_46_1/bin.v2/libs/system/build/gcc-4.4.3/release/threading-multi/libboost_system.so.1.46.1
/usr/local/lib/libboost_system.so
/usr/local/lib/libboost_system.a
/usr/local/lib/libboost_system.so.1.46.1
/root/tmp/boost_1_46_1/bin.v2/libs/system/build/gcc-4.4.3/release/link-static/threading-multi/libboost_system.a
/root/tmp/boost_1_46_1/bin.v2/libs/system/build/gcc-4.4.3/release/threading-multi/libboost_system.so.1.46.1

为什么这些文件在 /usr/lib/lib 中?这是一个问题吗?

还有ls -l /usr/lib/lib | grep boost_system

ls -l /usr/lib/lib | grep boost_system
-rw-r--r-- 1 root root   21574 2011-05-09 15:15 libboost_system.a
lrwxrwxrwx 1 root root      25 2011-05-09 15:15 libboost_system.so -> libboost_system.so.1.46.1
-rwxr-xr-x 1 root root   20053 2011-05-09 15:15 libboost_system.so.1.46.1

atm 我的 makefile 看起来像

LIBPATH=-I/usr/local/include/cpp-netlib 
LIBS=$(LIBPATH) -lboost_system  -lboost_filesystem -lboost_thread -lpthread 

LD=g++ -g 
CPP=g++ -c -g $(LIBS)

P=.
OBJ=$(P)/tmp/main.o $(P)/tmp/CLink.o $(P)/tmp/CFetcher.o

main:   $(OBJ); $(LD) $(OBJ) $(LIBS) -o $@


$(P)/tmp/CLink.o:   $(P)/src/CLink.cpp $(P)/include/CLink.h; $(CPP) -c $< -o $@
$(P)/tmp/CFetcher.o:    $(P)/src/CFetcher.cpp $(P)/include/CFetcher.h; $(CPP) -c $< -o $@
$(P)/tmp/main.o:    $(P)/src/main.cpp $(P)/include/CLink.h $(P)/include/CFetcher.h ; $(CPP) -c $< -o $@

all:
    touch $(P)/tmp/*.o;
    touch main;
    rm -f $(P)/tmp/*.o;
    rm -f main;
    make main;

编译器的输出是谎言

g++ -c -g -I/usr/local/include/cpp-netlib  -lboost_system  -lboost_filesystem -lboost_thread -lpthread  -c src/main.cpp -o tmp/main.o
g++ -c -g -I/usr/local/include/cpp-netlib  -lboost_system  -lboost_filesystem -lboost_thread -lpthread  -c src/CLink.cpp -o tmp/CLink.o
g++ -c -g -I/usr/local/include/cpp-netlib  -lboost_system  -lboost_filesystem -lboost_thread -lpthread  -c src/CFetcher.cpp -o tmp/CFetcher.o
g++ -g  ./tmp/main.o ./tmp/CLink.o ./tmp/CFetcher.o -I/usr/local/include/cpp-netlib  -lboost_system  -lboost_filesystem -lboost_thread -lpthread  -o main

所以对我来说一切看起来都不错,但是当我尝试运行程序时

./main

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

【问题讨论】:

    标签: c++ boost makefile


    【解决方案1】:
    1. -l 标志必须位于链接器命令行上的源文件之后

      是的,这意味着您必须将LD 定义拆分为LDLIBS,将所有-L-l 标志放在后面,并将链接命令更改为:

      $(LD) $(OBJ) $(LIBS) -o $@

    2. 库(.so(动态)或.a(静态))文件必须与标头的版本相同。虽然/usr/local/include/boost_1_46_1/ 中安装了 boost 1.46.1 头文件,但似乎根本没有安装相应的库文件。唯一安装的库是 /usr/lib 中的 1.40.0 版本,因此链接器会找到那些(即使您没有包含 -L/usr/lib 标志,默认情况下也会搜索 /usr/lib),但它们不包含符号预计在 1.46.1 之前。

      请注意,当链接到共享库时(在 Linux 中强烈建议使用共享库),链接器会查找带有 .so 扩展名的文件,但这通常是指向添加了版本后缀的文件的符号链接,并且链接器会读取它并在二进制文件中记录目标名称。这样,在安装 1.46 后,针对 .1.40 编译的程序将继续工作,因为在 .so 重定向到 1.46.1 版本后,libboost*.so.1.40.0 可能(并且必须)保留。

      应该甚至可以像这样安装:

      /usr/local/lib/boost_1_46_1/libboost_system-mt.so -> /usr/local/lib/libboost_system-mt.so.1.46
      /usr/local/lib/libboost_system-mt.so.1.46 -> /usr/local/lib/libboost_system-mt.so.1.46.1
      /usr/local/lib/libboost_system-mt.so.1.46.1
      

      并使用-L/usr/local/lib/boost_1_46_1 进行编译,尽管我目前找不到任何可以确认这一点的包。这样,您可以安装多个版本的开发文件,并使用显式-I-L 标志在它们之间切换,而动态链接器仍会找到运行时文件,它只在/usr/local/lib/usr/lib 和@ 中查找987654342@(可以在/etc/ld.so.conf配置,但这是默认的)。

    【讨论】:

    • $(LIBS) 的另一个通用名称是 $(LDFLAGS)
    • 嘿谢谢你的回答,我希望我明白你的意思。只看主帖。这是正确的吗 ?因为制作失败... greetz
    • @Roby:这就是我的意思。我相信您想要要么 -mt 变体 其他变体,而不是两者,您可能需要更改库的顺序。
    • @Roby:你确定你有来自同一版本的 boost 的头文件和库吗?您将 -L 标志与包含路径的路径一起使用,但库在其他地方(/usr/local/lib/boost_1_46_1 也许?),因此正在使用来自 /usr/lib 的库,如果它们是不同的版本,它将不会链接。跨度>
    • @Roby:我认为-L 标志不正确。它们不应该与-I 相同。你能找到 /lib /usr/lib /usr/local -name 'libboost_system-mt.*',好吗?
    【解决方案2】:

    使用 strace 执行您的应用程序。这将显示您的应用程序正在寻找您的提升库的位置。在我的例子中,一个应用程序正在 /usr/lib/x86_64-linux-gnu 中寻找实际位置为 /usr/lib/lib 的 boost 库。在我的案例LD_LIBRARY_PATH=/usr/lib/lib 中,添加 boost 共享库的路径的简单导出语句很有效。

    strace 的输出

    open("/usr/lib/x86_64-linux-gnu/libboost_system.so.1.46.1", O_RDONLY) = -1 ENOENT (No such file or directory)
    exit_group(127)                         = ?
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      • 2012-07-19
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多