gpt4 book ai didi

c++ - 简单 boost 序列化中的未定义引用错误

转载 作者:行者123 更新时间:2023-12-02 10:15:40 29 4
gpt4 key购买 nike

我有一个 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 中运行这个程序时,我得到了一大串 undefined reference 错误,如下所示:
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_DEBUGON并查看输出,并注意到以下内容:
_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 重建 boost而不是 toolset=gcc ,但我仍然在库文件名中得到“-mgw8”。

编辑 2

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

最佳答案

在意识到问题是我在 中提到的问题之后编辑 ,我进一步研究了如何解决该问题,发现您可以手动设置用于搜索变量 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com