简体   繁体   English

C++ Mac 上的 Boost oarchive 编译错误“架构 x86_64 的未定义符号:”。 使用 cmake

[英]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:信息:

  • macOS 10.15.5 macOS 10.15.5
  • cmake version 3.19.6 (installed via homebrew) cmake 版本 3.19.6(通过自制软件安装)
  • boost version 1.67.0 (installed via homebrew) boost 1.67.0 版(通过自制软件安装)

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_directorieslink_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM