【问题标题】:Can't build test suite in cmake project with Boost.Test on Apple Silicon无法在 Apple Silicon 上使用 Boost.Test 在 cmake 项目中构建测试套件
【发布时间】:2021-04-07 14:45:13
【问题描述】:

我在 Apple Silicon 电脑上关注 JetBrains's tutorial。我用 MacPorts 安装了 boost (sudo port install boost),版本是 1.71 构建 tests.cpp 文件失败,出现以下错误:

ld: warning: ignoring file /opt/local/lib/libboost_unit_test_framework-mt.dylib, building for macOS-x86_64 but attempting to link with file built for macOS-arm64
Undefined symbols for architecture x86_64:
  "boost::test_tools::tt_detail::report_assertion(boost::test_tools::assertion_result const&, boost::unit_test::lazy_ostream const&, boost::unit_test::basic_cstring<char const>, unsigned long, boost::test_tools::tt_detail::tool_level, boost::test_tools::tt_detail::check_type, unsigned long, ...)", referenced from:
      my_testsuite::addvalues_zero::test_method() in tests.cpp.o
      my_testsuite::addvalues_negpos::test_method() in tests.cpp.o
  "boost::test_tools::tt_detail::format_assertion_result(boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>)", referenced from:
      boost::test_tools::assertion::binary_expr<boost::test_tools::assertion::value_expr<int>, int, boost::test_tools::assertion::op::EQ<int, int, void> >::evaluate(bool) const in tests.cpp.o
  "boost::unit_test::lazy_ostream::inst", referenced from:
      boost::unit_test::lazy_ostream::instance() in tests.cpp.o
  "boost::unit_test::unit_test_main(bool (*)(), int, char**)", referenced from:
      _main in tests.cpp.o
  "boost::unit_test::unit_test_log_t::set_checkpoint(boost::unit_test::basic_cstring<char const>, unsigned long, boost::unit_test::basic_cstring<char const>)", referenced from:
      my_testsuite::addvalues_zero_invoker() in tests.cpp.o
      my_testsuite::addvalues_zero::test_method() in tests.cpp.o
      my_testsuite::addvalues_negpos_invoker() in tests.cpp.o
      my_testsuite::addvalues_negpos::test_method() in tests.cpp.o
  "boost::unit_test::unit_test_log_t::instance()", referenced from:
      ___cxx_global_var_init in tests.cpp.o
  "boost::unit_test::decorator::collector_t::instance()", referenced from:
      ___cxx_global_var_init.3 in tests.cpp.o
      ___cxx_global_var_init.6 in tests.cpp.o
      ___cxx_global_var_init.10 in tests.cpp.o
  "boost::unit_test::framework::impl::master_test_suite_name_setter::master_test_suite_name_setter(boost::unit_test::basic_cstring<char const>)", referenced from:
      ___cxx_global_var_init.1 in tests.cpp.o
  "boost::unit_test::test_case::test_case(boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>, unsigned long, boost::function<void ()> const&)", referenced from:
      boost::unit_test::make_test_case(boost::function<void ()> const&, boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>, unsigned long) in tests.cpp.o
  "boost::unit_test::ut_detail::auto_test_unit_registrar::auto_test_unit_registrar(boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>, unsigned long, boost::unit_test::decorator::collector_t&)", referenced from:
      ___cxx_global_var_init.3 in tests.cpp.o
  "boost::unit_test::ut_detail::auto_test_unit_registrar::auto_test_unit_registrar(boost::unit_test::test_case*, boost::unit_test::decorator::collector_t&, unsigned long)", referenced from:
      ___cxx_global_var_init.6 in tests.cpp.o
      ___cxx_global_var_init.10 in tests.cpp.o
  "boost::unit_test::ut_detail::auto_test_unit_registrar::auto_test_unit_registrar(int)", referenced from:
      ___cxx_global_var_init.15 in tests.cpp.o
  "boost::unit_test::ut_detail::normalize_test_case_name(boost::unit_test::basic_cstring<char const>)", referenced from:
      boost::unit_test::make_test_case(boost::function<void ()> const&, boost::unit_test::basic_cstring<char const>, boost::unit_test::basic_cstring<char const>, unsigned long) in tests.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)
make[3]: *** [test/test] Error 1
make[2]: *** [test/CMakeFiles/test.dir/all] Error 2
make[1]: *** [test/CMakeFiles/test.dir/rule] Error 2
make: *** [test] Error 2

我在 tests.cpp 中的代码:

#define BOOST_TEST_MAIN
#define BOOST_TEST_MODULE my_unit_tests
#define BOOST_TEST_DYN_LINK

#include <boost/test/unit_test.hpp>
#include "../calc.h"

BOOST_AUTO_TEST_SUITE(my_testsuite)

    BOOST_AUTO_TEST_CASE(addvalues_zero)
    {
        BOOST_TEST(add(0, 0) == 0);
        BOOST_TEST(add(-5, 5) == 0);
    }

    BOOST_AUTO_TEST_CASE(addvalues_negpos)
    {
        BOOST_TEST(add(-5, 10) == 5);
        BOOST_TEST(add(-10, 5) == -5);
        BOOST_TEST(add(5, 10) == 15);
    }

BOOST_AUTO_TEST_SUITE_END()

我在 test/CMakeLists.txt 中的代码:

set(Boost_USE_STATIC_LIBS OFF)
find_package(Boost REQUIRED COMPONENTS unit_test_framework)

include_directories(${Boost_INCLUDE_DIR})

add_executable(test tests.cpp)
target_link_libraries(test ${Boost_LIBRARIES})
target_link_libraries(test test_lib)

我在 cmake-build-debug 文件夹中有这个库,并且我在主 CMakeLists.txt 中包含了测试子项目。

【问题讨论】:

  • 看起来你没有告诉 cmake 使用哪个架构,它默认为 x64
  • 我将 CMAKE_APPLE_SILICON_PROCESS 变量设置为 arm64,但没有帮助。
  • 你可能想要CMAKE_OSX_ARCHITECTURES

标签: c++ cmake clion apple-silicon boost.test


【解决方案1】:

添加

set(CMAKE_OSX_ARCHITECTURES, arm64)

在根CmakeLists.txt的最开始。

【讨论】:

    【解决方案2】:

    也许你也需要这个:

    set(CMAKE_SYSTEM_PROCESSOR arm64)
    set(CMAKE_OSX_ARCHITECTURES arm64)
    

    顺便说一句,如果您遇到这些错误,可能是您使用了过时的 macOS 版本,或者您没有下载 XCode。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 2013-02-24
      • 2021-09-01
      • 2022-10-03
      相关资源
      最近更新 更多