简单升压序列化中的未定义引用错误

Undefined reference errors in simple boost serialization

我有一个 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 文件加载没有错误(只有一个警告说 "New Boost version may have incorrect or missing dependencies and imported targets," 虽然我听说这个警告并不重要,因为它只是意味着当前版本的 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

我找到了上述问题的解决方案。我已经在下面发布了。

在意识到问题是我在 EDIT 中提到的问题后,我进一步研究了如何解决该问题,我发现您可以手动设置编译器用于搜索变量 Boost_COMPILER.

我将 CMake 文件更改为以下内容:

cmake_minimum_required(VERSION 3.15)
project(Test)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "C:/boost_1_73_0")
set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "C:/boost_1_73_0/libs")
set(Boost_DEBUG ON)
set(Boost_COMPILER -mgw8)
set(Boost_ARCHITECTURE -x64)
set(BOOST_ROOT C:/boost)
set(BOOST_INCLUDEDIR C:/boost/include/boost-1_73/boost)
set(BOOST_LIBRARYDIR C:/boost/lib)
set(BOOST_NO_SYSTEM_PATHS ON)
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()

我认为这里的关键变化是设置 Boost_COMPILERBoost_ARCHITECTURE。我意识到 Boost_ARCHITECTURE 需要从这个问题中设置:.

有了这个 CMake 文件,我的 main.cpp 上面的 运行 文件就正确了。