我正在尝试在Ubuntu系统上编译,我有两个不同版本的boost
instaled:{strong> 1.46.1 /usr/lib/
和 1.61.0 < / strong>在/usr/local/lib/
中。
我已经声明 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
答案 0 :(得分:1)
您可以通过让链接器承认它实际使用的库来确认或反驳您的怀疑。将选项-Wl,--verbose
添加到g++
链接命令行(在makefile中或直接尝试)。然后链接器会吐出哪个确切的文件与它尝试链接的所有内容匹配,包括你的boost库。
如果事实证明它实际上链接了错误的版本,它还通过指定链接器尝试定位给定库的路径的确切顺序,为您提供了确切原因的线索。如果您需要更改某些选项(例如-L...
和-l...
选项的排序和/或内容),这应该会为您提供一些弹药
如果此操作失败,您还可以使用选项-l:/path/to/exact/libboost_whatever.so
。这将强制使用给定版本的链接器。我会尝试最后一次。