我有一个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_COMPILER
和Boost_ARCHITECTURE
。我意识到需要从以下问题设置Boost_ARCHITECTURE
:Linking boost in CLion project。有了这个CMake文件,我上面的main.cpp文件正常运行了。
关于c++ - 简单Boost序列化中的未定义引用错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62010279/