gpt4 book ai didi

c++ - boost 和 cpp-netlib 使编译错误

转载 作者:行者123 更新时间:2023-11-30 02:08:55 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

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

    请注意,当链接到共享库时(在 Linux 中强烈建议使用共享库),链接器会查找扩展名为 .so 的文件,但这通常是指向具有添加版本的文件的符号链接(symbolic link)后缀,链接器读取它并将目标名称记录在二进制文件中。这样,针对 .1.40 编译的程序将在安装 1.46 后继续工作,因为 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,但这是默认设置)。

关于c++ - boost 和 cpp-netlib 使编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5933879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com