boost和cpp-netlib使编译错误

时间:2011-05-09 07:31:00

标签: c++ boost makefile

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

[更新3] 新版本

好的,我想我修了一些东西

使用find / -name "libboost_system.*" outout是

/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: error while loading shared libraries: libboost_system.so.1.46.1: cannot open shared object file: No such file or directory

2 个答案:

答案 0 :(得分:2)

  1. 在链接器命令行上的源文件之后,-l标志必须

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

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

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

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

    甚至可以安装如下:

    /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/lib(可在/etc/ld.so.conf中配置,但这是默认设置。)

答案 1 :(得分:2)

使用strace执行您的应用程序。这将显示您的应用程序正在寻找您的升级库的位置。在我的情况下,一个应用程序在/usr/lib/x86_64-linux-gnu中查找实际位置为/usr/lib/lib的增强库。在我的案例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)                         = ?