1

我对 CMake 的困扰不断加重 D:

我的想法是创建我的项目,这样当我构建它时,它会运行单元测试,如果单元测试失败,它会自行清理。否则,如果它们成功,则构建将可运行的可执行文件吐到 run/ 目录中。

我的项目目录包含子目录源、标头、构建、运行和 tst/ut,到目前为止,我在项目根目录以及源和标头目录内部都有 cmakelists

项目根目录下的 CMakeLists.txt


project(TaskFour LANGUAGES CXX)

enable_testing()

set(BIN ${CMAKE_PROJECT_NAME})

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED)



add_library(${BIN}_lib)
add_executable(${BIN}_run)

include_directories(sources headers tst/ut)

cmakelists 在来源/


set(SRC
    main.cpp)

target_sources(${BIN} PUBLIC ${SRC})

和标题


#contents of this list are empty by design for now
set(SRC
    "")

target_sources(${BIN} PUBLIC ${SRC})

使用这些 CMake 列表文件,QtCreator 无法看到顶级 CMake 列表文件之外的任何内容。它不承认项目目录中的子目录、其他两个 cmakeLists.txt 文件以及源目录中非常存在的 main.cpp 的存在。

我尝试使用 add_subdirectory 命令,这似乎有所帮助,因为它使所有子目录都显示出来。但是,我很快意识到 QtCreator 似乎将每个子目录都视为自己的项目,并且尝试将文件添加到这些新奇的“项目”中会导致简单的“无法将一个或多个文件添加到项目 foo”消息。

我知道 CMake 列表文件的要点是每个项目有几个,每个项目管理自己的较大项目的子部分,并且顶部的 CMake 列表文件将它们收集在一起。在我将我的 CMake 文件作为项目根目录的一个大文件之前,我已经明白这不好。我也明白像我一样划分标题和来源并不是最常见的做法,但我希望你能原谅我并帮助我让这件事正常工作。

所以,我的实际问题是,我该怎么做?我目前在顶级 cmakelists 文件中做错了什么导致 qtCreator 在项目中找不到文件?如何编写 CMake 列表以便它允许我使用 QTest 框架,甚至可以从 QtCreator 的项目向导构建骨架(因为目前将自动测试项目添加为子项目的选项是灰色的)?

任何见解都值得赞赏,如果您愿意,请随时详细了解 CMake。这是我觉得我一直错过的软件开发的一个重要部分。

4

1 回答 1

1

您组织 CMake 文件的方式存在一些问题。这至少应该让你开始走上正确的道路

  1. 您正在调用add_library(${BIN}_lib)add_executable(${BIN}_run)但随后在您正在调用的子 CMake 文件中target_sources(${BIN} ...)- 目标名称被评估为字符串 - 没有名为 BIN 的目标(或在本例中设置为 BIN 的值),并将源添加到名为BIN 不会将这些源传播到名为 BIN_lib 和 BIN_run 的目标
  2. include_directories用于将条目添加到 C++ 编译器的包含搜索路径,而不是用于添加包含源/其他 CMake 文件的其他目录。为此,您似乎已经想通了,您需要add_subdirectories(...)
于 2021-07-29T16:33:04.433 回答