簡體   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