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

标签 c++ boost makefile

我正在尝试在 Ubuntu 系统上编译,我有两个不同版本的 boost安装:1.46.1/usr/lib//usr/local/lib/ 中的 1.61.0 .

我已经说过 1.61.0 给我带来了一些编译问题,但我不希望在有更多时间时将其删除以研究问题。我想我可以引用 makefile1.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/

相关文章:

在 Makefile 中处理链接的正确方法?

c++ - 根据指向第一个和最后一个元素的指针计算数组中元素的数量

c++ - 涵盖boost::trim并接受std::vector <std::string>的函数

c++ - 如何正确地将 boost::optional<std::chrono::duration> 作为函数参数?

c - 调用 make 时缺少分隔符

c++ - Makefile 自定义变量

c++ - 迷你过滤器拦截拖放文件到磁盘?

c++ - 无符号字符连接

c++ - 检索头文件中定义的结构列表

c++ - ptr_map 插入