在安装了两个不同Boost版本的系统上编译C ++代码

时间:2016-06-03 09:34:24

标签: c++ boost makefile

我正在尝试在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  

1 个答案:

答案 0 :(得分:1)

您可以通过让链接器承认它实际使用的库来确认或反驳您的怀疑。将选项-Wl,--verbose添加到g++链接命令行(在makefile中或直接尝试)。然后链接器会吐出哪个确切的文件与它尝试链接的所有内容匹配,包括你的boost库。

如果事实证明它实际上链接了错误的版本,它还通过指定链接器尝试定位给定库的路径的确切顺序,为您提供了确切原因的线索。如果您需要更改某些选项(例如-L...-l...选项的排序和/或内容),这应该会为您提供一些弹药

如果此操作失败,您还可以使用选项-l:/path/to/exact/libboost_whatever.so。这将强制使用给定版本的链接器。我会尝试最后一次。