我有一个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或增强功能。我尝试用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:Linking boost in CLion project

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

关于c++ - 简单Boost序列化中的未定义引用错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62010279/

10-16 07:32