解决创建了从/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.1atm我的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;编译器的输出是lie
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发布于 2011-05-09 09:28:30
,
-l标志必须在链接器命令行的源文件之后。是的,这意味着您必须将LD定义拆分为LD和LIBS,将所有-L和-l标志放在后面,并将链接命令更改为:
$(LD) $(OBJ) $(LIBS) -o $@
.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和/lib (可以在/etc/ld.so.conf中配置,但这是默认的)。
发布于 2011-06-11 15:16:08
使用strace执行应用程序。这将显示的位置,如果你的应用程序正在寻找你的提升库。在我的例子中,一个应用程序正在/usr/lib/x86_64-linux-gnu中寻找boost库,它的实际位置是/usr/lib/lib。一个简单的导出语句添加了boost共享库的路径,在我的例子中,LD_LIBRARY_PATH=/usr/lib/lib成功了。
输出来自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) = ?https://stackoverflow.com/questions/5933879
复制相似问题