首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost和cpp-netlib编译错误

boost和cpp-netlib编译错误
EN

Stack Overflow用户
提问于 2011-05-09 07:30:59
回答 2查看 2.8K关注 0票数 1

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

更新3新版本:

好吧,我想我修好了

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

代码语言:javascript
复制
/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

代码语言:javascript
复制
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看起来像

代码语言:javascript
复制
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

代码语言:javascript
复制
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

所以对我来说一切都很好,但是当我试图运行这个程序的时候

./主要

代码语言:javascript
复制
./main: error while loading shared libraries: libboost_system.so.1.46.1: cannot open shared object file: No such file or directory
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-09 09:28:30

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

是的,这意味着您必须将LD定义拆分为LDLIBS,将所有-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中配置,但这是默认的)。

票数 2
EN

Stack Overflow用户

发布于 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

代码语言:javascript
复制
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)                         = ?
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5933879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档