[英]C++ Boost oarchive compile errror on Mac “Undefined symbols for architecture x86_64:”. Using cmake
I'm having issues compiling with boost serialization tools.我在使用 boost 序列化工具进行编译时遇到问题。 Info:
信息:
I built a small test program, that looks like this:我构建了一个小型测试程序,如下所示:
#include <boost/archive/text_oarchive.hpp>
#include <fstream>
void writeTest(std::string test, std::string filename) {
std::ofstream ofs( filename.c_str() );
boost::archive::text_oarchive oa( ofs );
oa << test;
}
int main(int argc, char *argv[]) {
writeTest("test123123123", "test.txt");
}
And my CMakeLists.txt
file looks like this:我的
CMakeLists.txt
文件如下所示:
cmake_minimum_required(VERSION 3.0.0)
project(testProj VERSION 0.1.0)
set(CMAKE_CXX_STANDARD 17)
SET (BOOST_MIN_VERSION "1.55.0")
FIND_PACKAGE(Boost ${BOOST_MIN_VERSION} REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
add_executable(testProj main.cpp ${Boost_LIBRARIES})
Then I run cmake --build.
然后我运行
cmake --build.
in my build folder and get the following error:在我的构建文件夹中并收到以下错误:
Undefined symbols for architecture x86_64:
"boost::archive::archive_exception::archive_exception(boost::archive::archive_exception::exception_code, char const*, char const*)", referenced from:
void boost::archive::basic_text_oprimitive<std::__1::basic_ostream<char, std::__1::char_traits<char> > >::save_impl<unsigned int>(unsigned int const&, mpl_::bool_<false>&) in main.cpp.o
void boost::archive::basic_text_oprimitive<std::__1::basic_ostream<char, std::__1::char_traits<char> > >::save_impl<boost::archive::object_id_type>(boost::archive::object_id_type const&, mpl_::bool_<false>&) in main.cpp.o
void boost::archive::basic_text_oprimitive<std::__1::basic_ostream<char, std::__1::char_traits<char> > >::save_impl<boost::archive::object_reference_type>(boost::archive::object_reference_type const&, mpl_::bool_<false>&) in main.cpp.o
void boost::archive::basic_text_oprimitive<std::__1::basic_ostream<char, std::__1::char_traits<char> > >::save_impl<boost::archive::class_id_type>(boost::archive::class_id_type const&, mpl_::bool_<false>&) in main.cpp.o
void boost::archive::basic_text_oprimitive<std::__1::basic_ostream<char, std::__1::char_traits<char> > >::save_impl<boost::archive::class_id_reference_type>(boost::archive::class_id_reference_type const&, mpl_::bool_<false>&) in main.cpp.o
void boost::archive::basic_text_oprimitive<std::__1::basic_ostream<char, std::__1::char_traits<char> > >::save_impl<boost::archive::tracking_type>(boost::archive::tracking_type const&, mpl_::bool_<false>&) in main.cpp.o
"boost::archive::archive_exception::archive_exception(boost::archive::archive_exception const&)", referenced from:
void boost::serialization::throw_exception<boost::archive::archive_exception>(boost::archive::archive_exception const&) in main.cpp.o
"boost::archive::archive_exception::~archive_exception()", referenced from:
void boost::archive::basic_text_oprimitive<std::__1::basic_ostream<char, std::__1::char_traits<char> > >::save_impl<unsigned int>(unsigned int const&, mpl_::bool_<false>&) in main.cpp.o
void boost::serialization::throw_exception<boost::archive::archive_exception>(boost::archive::archive_exception const&) in main.cpp.o
void boost::archive::basic_text_oprimitive<std::__1::basic_ostream<char, std::__1::char_traits<char> > >::save_impl<boost::archive::object_id_type>(boost::archive::object_id_type const&, mpl_::bool_<false>&) in main.cpp.o
void boost::archive::basic_text_oprimitive<std::__1::basic_ostream<char, std::__1::char_traits<char> > >::save_impl<boost::archive::object_reference_type>(boost::archive::object_reference_type const&, mpl_::bool_<false>&) in main.cpp.o
void boost::archive::basic_text_oprimitive<std::__1::basic_ostream<char, std::__1::char_traits<char> > >::save_impl<boost::archive::class_id_type>(boost::archive::class_id_type const&, mpl_::bool_<false>&) in main.cpp.o
void boost::archive::basic_text_oprimitive<std::__1::basic_ostream<char, std::__1::char_traits<char> > >::save_impl<boost::archive::class_id_reference_type>(boost::archive::class_id_reference_type const&, mpl_::bool_<false>&) in main.cpp.o
void boost::archive::basic_text_oprimitive<std::__1::basic_ostream<char, std::__1::char_traits<char> > >::save_impl<boost::archive::tracking_type>(boost::archive::tracking_type const&, mpl_::bool_<false>&) in main.cpp.o
...
"boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::save(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
void boost::archive::save_access::save_primitive<boost::archive::text_oarchive, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(boost::archive::text_oarchive&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in main.cpp.o
"boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::text_oarchive_impl(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, unsigned int)", referenced from:
boost::archive::text_oarchive::text_oarchive(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, unsigned int) in main.cpp.o
"boost::archive::basic_text_oarchive<boost::archive::text_oarchive>::newtoken()", referenced from:
void boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::save<unsigned int>(unsigned int const&) in main.cpp.o
void boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::save<boost::archive::object_id_type>(boost::archive::object_id_type const&) in main.cpp.o
void boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::save<boost::archive::object_reference_type>(boost::archive::object_reference_type const&) in main.cpp.o
void boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::save<boost::archive::class_id_type>(boost::archive::class_id_type const&) in main.cpp.o
void boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::save<boost::archive::class_id_reference_type>(boost::archive::class_id_reference_type const&) in main.cpp.o
void boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::save<boost::archive::tracking_type>(boost::archive::tracking_type const&) in main.cpp.o
"boost::archive::basic_text_oprimitive<std::__1::basic_ostream<char, std::__1::char_traits<char> > >::~basic_text_oprimitive()", referenced from:
boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::~text_oarchive_impl() in main.cpp.o
"boost::archive::detail::basic_oarchive::end_preamble()", referenced from:
void boost::archive::save_access::save_primitive<boost::archive::text_oarchive, boost::archive::version_type>(boost::archive::text_oarchive&, boost::archive::version_type const&) in main.cpp.o
void boost::archive::save_access::save_primitive<boost::archive::text_oarchive, boost::archive::object_id_type>(boost::archive::text_oarchive&, boost::archive::object_id_type const&) in main.cpp.o
void boost::archive::save_access::save_primitive<boost::archive::text_oarchive, boost::archive::object_reference_type>(boost::archive::text_oarchive&, boost::archive::object_reference_type const&) in main.cpp.o
void boost::archive::save_access::save_primitive<boost::archive::text_oarchive, boost::archive::class_id_type>(boost::archive::text_oarchive&, boost::archive::class_id_type const&) in main.cpp.o
void boost::archive::save_access::save_primitive<boost::archive::text_oarchive, boost::archive::class_id_reference_type>(boost::archive::text_oarchive&, boost::archive::class_id_reference_type const&) in main.cpp.o
void boost::archive::save_access::save_primitive<boost::archive::text_oarchive, boost::archive::tracking_type>(boost::archive::text_oarchive&, boost::archive::tracking_type const&) in main.cpp.o
void boost::archive::save_access::save_primitive<boost::archive::text_oarchive, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(boost::archive::text_oarchive&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in main.cpp.o
...
"boost::archive::detail::basic_oarchive::~basic_oarchive()", referenced from:
boost::archive::detail::common_oarchive<boost::archive::text_oarchive>::~common_oarchive() in main.cpp.o
"typeinfo for boost::archive::archive_exception", referenced from:
void boost::serialization::throw_exception<boost::archive::archive_exception>(boost::archive::archive_exception const&) in main.cpp.o
"typeinfo for boost::archive::detail::basic_oarchive", referenced from:
typeinfo for boost::archive::detail::common_oarchive<boost::archive::text_oarchive> in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Maybe it has something to do with the compiler?也许它与编译器有关? I checked CMAKE_CXX_COMPILER_ID in cmake which is "AppleClang".
我检查了 cmake 中的 CMAKE_CXX_COMPILER_ID 是“AppleClang”。
Really appreciate any help, I am totally new to cmake and boost.非常感谢任何帮助,我对 cmake 和提升完全陌生。
Never expand package variables into your sources.切勿将 package 变量扩展到您的源代码中。 Always prefer imported targets.
总是喜欢导入的目标。 If you do things the easiest possible way in modern CMake, you get simple, portable builds like this:
如果您在现代 CMake 中以最简单的方式进行操作,您将获得如下简单、可移植的构建:
cmake_minimum_required(VERSION 3.19)
project(testProj VERSION 0.1.0)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED YES)
set(CMAKE_CXX_EXTENSIONS NO)
find_package(Boost 1.55 REQUIRED serialization)
add_executable(testProj main.cpp)
target_link_libraries(testProj PRIVATE Boost::serialization)
That's all it takes!仅此而已! Imported targets like
Boost::serialization
set up library and include paths for you . Boost::serialization
等导入的目标会为您设置库并包含路径。 They carry that information with them.他们随身携带这些信息。 I tested this on my Mac Mini with homebrew-installed CMake and Boost and your
main.cpp
.我在我的 Mac Mini 上使用安装了自制软件的 CMake 和 Boost 以及你的
main.cpp
对此进行了测试。
To determine which imported targets a package provides, read its documentation.要确定 package 提供了哪些导入目标,请阅读其文档。 For Boost, it's here: https://cmake.org/cmake/help/latest/module/FindBoost.html
对于 Boost,它在这里: https://cmake.org/cmake/help/latest/module/FindBoost.html
Some general CMake advice: Use lowercase names for CMake commands.一些通用的 CMake 建议:对 CMake 命令使用小写名称。 Forget
include_directories
and link_directories
exist.忘记
include_directories
和link_directories
存在。 Don't create unnecessary variables like BOOST_MIN_VERSION
.不要创建不必要的变量,例如
BOOST_MIN_VERSION
。 Finally, never set a minimum CMake version lower than the one you use to test it.最后,切勿将最低 CMake 版本设置为低于您用于测试它的版本。 CMake doesn't warn you if you use something too new for the minimum version.
如果您对最低版本使用太新的东西,CMake 不会警告您。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.