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

Compiling C++ code on a system with two different Boost versions installed

本文关键字:版本 Boost 系统 代码 C++ 编译 安装 两个      更新时间:2023-10-16

我正在尝试在 Ubuntu 系统上编译,其中我安装了两个不同版本的boost/usr/lib/ 中的 1.46.1 和/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++链接命令行(在生成文件中或直接尝试此操作)。然后,链接器将吐出与它尝试链接的所有内容(包括您的 boost 库)匹配的确切文件。

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

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