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