简单升压序列化中的未定义引用错误
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_COMPILER
和 Boost_ARCHITECTURE
。我意识到 Boost_ARCHITECTURE
需要从这个问题中设置:.
有了这个 CMake 文件,我的 main.cpp 上面的 运行 文件就正确了。
我有一个 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_COMPILER
和 Boost_ARCHITECTURE
。我意识到 Boost_ARCHITECTURE
需要从这个问题中设置:
有了这个 CMake 文件,我的 main.cpp 上面的 运行 文件就正确了。