如何在 Qt Creator 中配置项目的 CMakeLists.txt 文件,而不是一个项目

Posted

技术标签:

【中文标题】如何在 Qt Creator 中配置项目的 CMakeLists.txt 文件,而不是一个项目【英文标题】:How to configure CMakeLists.txt files of projects for have separated projects in Qt Creator instead one project 【发布时间】:2017-06-01 09:25:54 【问题描述】:

我有 2 个可执行项目,每个项目都依赖于一个解决方案中的 2 个库(root CMakeLists.txt)。构建没问题,结果我有 2 个库和 2 个可执行文件。但是,当我尝试在 Qt 创建器中打开根 CMakeLists.txt 而不是 4 个项目 (src1, src2, subproject1, subproject2) 和 CMakeLists.txt 时,结果我只有一个名为 "Project" 的项目,其中包括我在 "Project" 容器中的 4 个项目就像这是包含文件夹。

我也无法选择要运行的项目 (Set project "Project" as Active Project),因为这只是一个项目。从 Qt 运行后,MainProject1 运行。

*** 和谷歌建议为此使用add_subdirectory,但这不起作用。在我的 CMakeLists 的 make 依赖和我已经使用过的几个项目中 add_subdirectory

Qt version: 5.7.0.
Qt Creator version: 4.0.2.
Ubuntu

请帮我解决这个问题。提前致谢。

项目结构和手动构建和结果:成功

项目结构:

root
    src1                    (executable which depends from subproject1 and subproject2)
        CMakeLists.txt
        main.cpp
    src2                    (executable which depends from subproject1 and subproject2)
        CMakeLists.txt
        main.cpp
    subproject1             (library)
        CMakeLists.txt
        hellow.cpp
        hellow.h
    subproject2             (library)
        CMakeLists.txt
        hellow.cpp
        hellow.h
    CMakeLists.txt          (the root CMakeLists)

构建并显示结果:

mkdir -p build && cd build && cmake .. && make &&
ll src1/MainProject1 && ll src2/MainProject2 && ll subproject1/libsubproject1.a && ll subproject2/libsubproject2.a

结果:

-rwxrwxr-x 1 qqq qqq 13570 Jun  1 10:45 src1/MainProject1*
-rwxrwxr-x 1 qqq qqq 13570 Jun  1 10:45 src2/MainProject2*
-rw-rw-r-- 1 qqq qqq 2820 Jun  1 10:45 subproject1/libsubproject1.a
-rw-rw-r-- 1 qqq qqq 2828 Jun  1 10:45 subproject2/libsubproject2.a 

一切正常

CMakeLists.txt

根 CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
add_subdirectory( src1 )
add_subdirectory( src2 )

subproject1/CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(subproject1)

set (sources
        ./hellow.cpp
        ./hellow.h
    )
add_library(subproject1 STATIC $sources)

subproject2/CMakeLists.txt

是一样的,但不是subproject1:subproject2

src1/CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(MainProject1)

set (sources
        ./main.cpp
    )

if (NOT TARGET subproject1)
     add_subdirectory( ./../subproject1 "$CMAKE_CURRENT_BINARY_DIR/../subproject1" )
     add_subdirectory( ./../subproject2 "$CMAKE_CURRENT_BINARY_DIR/../subproject2" )
endif() 

add_executable(MainProject1 $sources)
target_link_libraries (MainProject1 subproject1)
target_link_libraries (MainProject1 subproject2)
add_dependencies( MainProject1 subproject1 )
add_dependencies( MainProject1 subproject2 )

src2/CMakeLists.txt

是一样的,但不是MainProject1:MainProject2

在 Qt Creator 中打开:失败

打开根 CMakeLists.txt 并在构建文件夹中配置构建。

项目结构结果(仅1个项目):

root
    Project
        CMakeLists.txt
        src1
        src2
        subproject1
        subproject2

预期(4 个项目):

root
    src1
    src2
    subproject1
    subproject2
    CMakeLists.txt

构建结果:

cd build && ll src1/MainProject1 && ll src2/MainProject2 && ll subproject1/libsubproject1.a && ll subproject2/libsubproject2.a

-rwxrwxr-x 1 qqq qqq 38670 Jun  1 11:10 src1/MainProject1*
-rwxrwxr-x 1 qqq qqq 38670 Jun  1 11:10 src2/MainProject2*
-rw-rw-r-- 1 qqq qqq 21900 Jun  1 11:10 subproject1/libsubproject1.a
-rw-rw-r-- 1 qqq qqq 21908 Jun  1 11:10 subproject2/libsubproject2.a

构建没问题。

运行项目

MainProject1 已运行。无法选择要运行的项目,因为 Qt Creator 将 root CMakeLists 视为只有一个项目。

注意

Correspound link to question in forum.qt.io

【问题讨论】:

【参考方案1】:

我会按照以下方式构建您的项目:

根 CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(MyComplexProject)
add_subdirectory( src1 )
add_subdirectory( src2 )
add_subdirectory( subproject1 )
add_subdirectory( subproject2 )

src1/CMakeLists.txt

set (sources
        ./main.cpp
    )

add_executable(MainProject1 $sources)
target_link_libraries (MainProject1 subproject1 subproject2)

subproject1/CMakeLists.txt

set (sources
        ./hellow.cpp
        ./hellow.h
    )
add_library(subproject1 STATIC $sources)

请等效修改 src2/CMakeLists.txt 和 subproject2/CMakeLists.txt。

注意:只有顶层 CMakeLists.txt 包含项目定义。其他 CMakeLists 仅包含目标定义。

target_link_libraries 默认为 lib 目标添加一个依赖项。所以不需要明确地完成。

通过将具有 target_link_libraries 的依赖项添加到可执行目标中,CMake 能够找出正确的构建顺序。

编辑:

看看How to load cmake script with more than one project with Qt Creator是否能进一步帮助你。

【讨论】:

谢谢,但这没有帮助。结果是一样的。我只看到根项目“Project”被重命名为“MyComplexProject”。关于“注意:只有顶层 CMakeLists.txt 包含项目定义”。这不是很好。我必须为每个项目/库命名,并且能够在没有 root 的情况下进行编译。例如。仅打开 subproject1 并编译它(如果它没有依赖项)。就像在 Visual Studio 中一样:如果我在 Visual Studio 中打开 separetad lib,而不是解决方案 (.sln),无论如何它都有来自 .vcproj 的名称,并且我能够编译它。有可能吗? 也就是说子项目1和子项目2的CMakeLists必须是自给自足的 那么请查看编辑中提到的链接。已接受答案的 cmets 部分包含如何选择要在 QtCreator 中构建的目标。 非常感谢。这不是很直观,但确实有效。正确方法:“之后,您可以在选择要运行的工具包 (3) 或调试 (4) 应用程序窗格 (link) 中选择要运行的项目”。所以这只是一种方法,我们不能像在 Visual Studio 解决方案中那样使用 cmake 在 Qt Creator 中分​​离项目。我们只能从根 CMakeLists.txt 中拥有一个根项目,但我们可以选择应该运行哪个可执行文件进行运行或调试。 Link to reply in Qt forums

以上是关于如何在 Qt Creator 中配置项目的 CMakeLists.txt 文件,而不是一个项目的主要内容,如果未能解决你的问题,请参考以下文章

如何将 OpenCV 集成到 Qt Creator Android 项目中

如何根据 cmak 在 qt creator 中使用 opencv Cuda

Qt Creator中如何选择某个子项目为启动项目

在Qt Creator中设置VS平台工具集

如何使用 Qt Creator 将 C++ 头文件添加到 Qt 项目

QT creator如何在Ubuntu中配置环境变量path