问题与高度特定的cmake + qtCreator用例和单元测试



我用CMake的麻烦不断复合D:

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

我的项目目录包含子目录source, headers, build, run和test/ut,到目前为止,我在项目根目录以及内部源和头目录中有cmakelist

项目根目录下的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)

cmakelist at sources/


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文件作为一个大文件在项目的根,我已经明白这不是很好。我也明白,像我这样将标题和源分开并不是最常见的做法,但我希望你能原谅我,并帮助我让这个东西工作。

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

任何见解都是赞赏的,如果你喜欢的话,可以自由地进入CMake的细节。这是软件开发的一个重要部分,我觉得我已经错过了。

这里有几个问题,你如何组织你的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(...)

最新更新