繁体   English   中英

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

[英]C++ Boost oarchive compile errror on Mac “Undefined symbols for architecture x86_64:”. Using cmake

我在使用 boost 序列化工具进行编译时遇到问题。 信息:

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

我构建了一个小型测试程序,如下所示:

#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");
}

我的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})

然后我运行cmake --build. 在我的构建文件夹中并收到以下错误:

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)

也许它与编译器有关? 我检查了 cmake 中的 CMAKE_CXX_COMPILER_ID 是“AppleClang”。

非常感谢任何帮助,我对 cmake 和提升完全陌生。

切勿将 package 变量扩展到您的源代码中。 总是喜欢导入的目标。 如果您在现代 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)

仅此而已! Boost::serialization等导入的目标会为您设置库并包含路径。 他们随身携带这些信息。 我在我的 Mac Mini 上使用安装了自制软件的 CMake 和 Boost 以及你的main.cpp对此进行了测试。

要确定 package 提供了哪些导入目标,请阅读其文档。 对于 Boost,它在这里: https://cmake.org/cmake/help/latest/module/FindBoost.html

一些通用的 CMake 建议:对 CMake 命令使用小写名称。 忘记include_directorieslink_directories存在。 不要创建不必要的变量,例如BOOST_MIN_VERSION 最后,切勿将最低 CMake 版本设置为低于您用于测试它的版本。 如果您对最低版本使用太新的东西,CMake 不会警告您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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