我正在尝试在 Ubuntu 系统上编译,我有两个不同版本的 boost
安装:1.46.1 在 /usr/lib/
和 /usr/local/lib/
中的 1.61.0 .
我已经说过 1.61.0 给我带来了一些编译问题,但我不希望在有更多时间时将其删除以研究问题。我想我可以引用 makefile
到 1.46.1,使用 -I"/usr/include/boost"
对于 1.46.1 源,然后是 -L /usr/lib
对于图书馆。但仍然没有工作。
我怀疑 -lboost_filesystem -lboost_system -lboost_date_time
的用法以某种方式引用 1.61.0,即使与 -L /usr/lib
一起使用也是如此(指向 1.46.1)。但是我一直无法找到有关链接器编译标志的信息。
我怎样才能确保那些-l
引用了 Boost
我想要的版本?
这是一个例子,说明了 makefile
链接时正在做(失败的部分):
Invoking: Cygwin C++ Linker
g++ -O0 -g3 -Wall -Wextra -o"../bin/MY_APP.exe" ../bin/objs/main.o ../bin/objs/FileLoad.o ../bin/objs/DatabaseLoad.o -L /usr/lib/mysql -L /usr/lib -lmysqlclient -lboost_filesystem -lboost_system -lboost_date_time
最佳答案
您可以通过让链接器承认它实际使用了哪些库来证实或反驳您的怀疑。将选项 -Wl,--verbose
添加到您的 g++
链接命令行(在 makefile 中或直接尝试)。链接器然后会吐出哪个确切文件与它试图链接的所有内容匹配,包括你的 boost 库。
如果事实证明它实际上链接了错误的版本,它还会通过指定链接器在定位给定库时尝试的确切路径顺序为您提供确切原因的线索。如果您需要更改某些选项(例如 -L...
和 -l...
选项的顺序和/或内容,这应该会给您一些弹药)
如果失败,您还可以使用选项 -l:/path/to/exact/libboost_whatever.so
。这将强制使用给定版本的链接器。不过,我会最后尝试这个。
关于c++ - 在安装了两个不同 Boost 版本的系统上编译 C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37610822/