[已解决]从/ 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
答案 0 :(得分:2)
在链接器命令行上的源文件之后,-l
标志必须
是的,这意味着您必须将LD
定义拆分为LD
和LIBS
,并将所有-L
和-l
标记放入稍后将链接命令更改为:
$(LD)$(OBJ)$(LIBS)-o $ @
库(.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共享库的路径的简单导出语句是一种享受。
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) = ?