【问题标题】:Unable to compile simple project structure (uses catch2 library) with cmake无法使用 cmake 编译简单的项目结构(使用 catch2 库)
【发布时间】:2023-03-21 23:29:01
【问题描述】:

我有一个非常简单的项目结构,我无法使用 CMake 进行编译。我尝试阅读有关 CMake 的文档或教程,但无法正常工作。

有一个similar question,但即使尝试了答案建议我也无法让它工作。

你可以看到我的完整代码here

但相关的 CMakeLists 是:

根级别:

cmake_minimum_required(VERSION 3.5)

find_package(Catch2 REQUIRED)

project(majorityQueries LANGUAGES CXX VERSION 0.0.1)

include_directories(include)

add_subdirectory(src)
add_subdirectory(tests)

file(GLOB SOURCES "*.cpp")

源代码:

add_library(fact factorial.cpp)

测试:

add_executable(test test_factorial.cpp)

target_link_libraries(test Catch2::Catch2)

但基本上我有一个 test_factorial.cpp 文件,其中包含标头 factorial.hpp(在包含目录中),因此应该知道 Factorial(int) 函数的存在,但它说它未定义。

我尝试的是:

cd build/
cmake ..
make

我希望 make 可以工作,但我得到了:

Undefined symbols for architecture x86_64:
  "Factorial(int)", referenced from:
      ____C_A_T_C_H____T_E_S_T____0() in test_factorial.cpp.o
  "Catch::NameAndTags::NameAndTags(Catch::StringRef const&, Catch::StringRef const&)", referenced from:
      ___cxx_global_var_init in test_factorial.cpp.o
  "Catch::StringMaker<int, void>::convert(int)", referenced from:
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > Catch::Detail::stringify<int>(int const&) in test_factorial.cpp.o (...)

【问题讨论】:

  • 确保 catch2 库不是用于 32 位架构的,而是用于 64 位的。
  • 我从 github 获取了你的源代码并得到了相同的构建错误。测试目录的 CMakeLists.txt 不完整。我将源文件test_main.cpp 添加到add_executable 条目和库facttarget_link_libraries 条目,现在它可以工作了。
  • 欢迎来到 Stack Overflow!在这里,我们期望问题帖子中的相关代码本身。请添加此代码。 “相关代码”并不意味着项目的转储。在您的情况下,您可以提供 CMakeLists.txt 创建并链接测试可执行文件,这会导致错误。您可以提供指向完整项目的链接,但只能作为问题中代码的附加,而不是作为它的替换
  • @MathiasSchmid 我没有将库 fact 的部分完全获取到 target_link_libraries。我应该在哪里声明这样的库?
  • @Tsyvarev 谢谢!我只是不确定哪个文件真正重要,我认为将它们全部发布出来很重要。例如,最终问题似乎不在主 CMakeLists.txt 上,而是在其中一个子目录上......在我在原始帖子中引用的问题中,问题的一部分是标题的引用方式从 src 文件。但下次我会尝试发布我认为相关的内容

标签: c++ cmake catch2


【解决方案1】:

正如我在评论中所写,将源文件test_main.cpp 和库fact 添加到./tests/CMakeLists.txt

add_executable(test test_main.cpp test_factorial.cpp)
target_link_libraries(test fact Catch2::Catch2)

【讨论】:

  • 感谢您的回答 Mathias,这确实有效!但我想我仍然不明白一般性:我对项目做了一个小改动,开始做我真正想做的事情而不是阶乘示例,并且再次遇到同样的错误,现在我正在添加可执行文件和链接库......如果你想看看它是github.com/bsubercaseaux/MajorityQueries中的最新提交
  • 我在 github 上为您的项目创建了一个问题。
猜你喜欢
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
相关资源
最近更新 更多