boost和cpp-netlib使编译错误
boost and cpp-netlib make compile ERROR
[SOLVED] 创建了从/usr/lib/lib/* 到/usr/lib* 的符号链接
[更新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
自动取款机我的制作文件看起来像
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
-
-l
标志必须位于链接器命令行上的源文件之后。是的,这意味着您必须将
LD
定义拆分为LD
和LIBS
,将所有-L
和-l
标志放在后面,并将 link 命令更改为:$(LD) $(OBJ) $(LIBS) -o $@
-
库(
.so
(动态)或.a
(静态))文件必须与标头的版本相同。虽然在/usr/local/include/boost_1_46_1/
中安装了 boost 1.46.1 标头,但相应的库文件似乎根本没有安装。唯一安装的库是/usr/lib
中的 1.40.0 版,因此链接器会找到这些库/usr/lib
(即使您没有包含-L/usr/lib
标志,默认情况下也会搜索这些库),但它们不包含 1.46.1 预期的符号。请注意,当链接到共享库时(强烈建议在 Linux 中使用共享库),链接器会查找扩展名为
.so
的文件,但这通常是指向带有添加版本后缀的文件的符号链接,链接器会读取它并将目标名称记录在二进制文件中。这样,针对 .1.40 编译的程序将在安装 1.46 时继续工作,因为在.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
中配置,但这是默认设置)。
使用 strace 执行应用程序。 这将显示您的应用程序正在寻找您的增强库的位置。就我而言,一个应用程序正在/usr/lib/x86_64-linux-gnu
寻找实际位置/usr/lib/lib
的增强库。一个简单的导出语句,在我的情况下添加提升共享库的路径LD_LIBRARY_PATH=/usr/lib/lib
是一种享受。
从跟踪输出
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) = ?
- std::is_base_of表示ctor编译错误
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- 如何修复sfml c++代码编译错误
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- vscode下的Arduino代码出现意外编译错误
- 第三方 API 中的编译错误 - Visual Studio
- std::cout输出int时出现编译错误
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 提升图广度优先搜索前置编译错误
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 我在C++中遇到了这个奇怪的编译错误
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- 使用 std::enable_if 限制派生类的模板参数时出现编译错误
- 现代OpenGL和GLEW Libraray的编译错误
- C++ 编译错误:意外的类型名称"字符串":预期的表达式
- C ++程序编译错误,找不到/访问文件
- 使用直接大括号初始化时,C++ 编译错误"声明末尾的预期";"
- 为什么传递非静态成员函数会导致编译错误?