【发布时间】:2020-09-12 13:20:31
【问题描述】:
我有一个 Boost 序列化的最小示例,我尝试将整数保存在二进制存档文件中
这里是 main.cpp:
#include <iostream>
#include <fstream>
#include <boost/archive/binary_oarchive.hpp>
int main() {
int t = 0;
std::ofstream file("Test.bin");
boost::archive::binary_oarchive archive(file);
archive << t;
file.close();
return 0;
}
这里是 CMake 文件:
cmake_minimum_required(VERSION 3.15)
project(Test)
set(CMAKE_CXX_STANDARD 17)
find_package(Boost REQUIRED serialization)
add_executable(Test main.cpp)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(Test ${Boost_LIBRARIES})
endif()
当我尝试在 CLion 中运行这个程序时,我得到了一大串未定义的引用错误,如下所示: https://pastebin.com/8uX9MZFf
我已经使用 vcpkg 包管理器设置了 Boost。我正在使用 Mingw-w64 进行编译。 CMake 文件加载时没有错误(只有一个警告说“新的 Boost 版本可能有不正确或缺少的依赖项和导入的目标”,尽管我听说这个警告并不重要,因为它只是意味着当前版本的 CMake '不知道最新版本的 Boost)。
我试图到处寻找解决方案,但我似乎无法在这里找到任何可行的方法。任何帮助将不胜感激。
我正在使用 cmake 3.15.3、boost 1.73.0 和 mingw-w64 6.0。
编辑
我在没有使用包管理器的情况下卸载并重新安装了 Boost,并尝试再次获取序列化库。在这种情况下,CMake 遇到错误,说它无法通过序列化找到 Boost(尽管它可以单独找到 Boost)。我将Boost_DEBUG 设置为ON 并查看输出,并注意到以下内容:
_boost_COMPILER = "-mgw81" (guessed)
CMake似乎猜测我用来编译boost的编译器是mgw81。我猜它从我的 gcc 版本中得到了 8.1,这是正确的。
Searching for SERIALIZATION_LIBRARY_RELEASE: boost_serialization-mgw81-mt-x64-1_73;boost_serialization-mgw81-mt-x64;...
作为编译器选择的结果,它会搜索名称中带有“-mgw81”的文件。问题是我构建 boost 时生成的库文件是这样命名的:
libboost_serialization-mgw8-mt-x64-1_73.a
这里写的是“-mgw8”而不是“-mgw81”。我不知道如何纠正 CMake 或以这种冲突不会发生的方式构建 boost。我尝试使用toolset=gcc-8.1 而不是toolset=gcc 重建boost,但我仍然在库文件名中得到“-mgw8”。
编辑 2
我找到了上述问题的解决方案。我已经在下面发布了。
【问题讨论】:
-
我可能误解了 CMake 的工作原理吗?我没有在“构建选项”或“CMake 选项”中执行任何其他链接操作,因为我假设 CMake 通过
target_link_libraries进行链接 -
使用较旧的 (1.69) boost 版本构建时,我得到了与
libboost_serialization.so.1.69.0正确链接的最终二进制文件 (Test)。 -
只有我这里有什么?好像没有采取其他步骤来链接该文件?另外,您是否使用 64 位 mingw 编译器构建?我怀疑这个问题可能与此有关。
-
我用你那里的东西构建,但使用 Fedora 附带的 64 位 g++ 版本。不幸的是,我没有 MinGW。
-
可能是您在某处安装了冲突的 boost 并且警告是正确的?