如何配置 CMakeLists.txt 个项目文件以在 Qt Creator 中将项目分开而不是一个项目

How to configure CMakeLists.txt files of projects for have separated projects in Qt Creator instead one project

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

我也不能为 运行 (Set project "Project" as Active Project) select 项目,因为这只是一个项目。在 Qt 运行 之后 MainProject1 是 运行.

Whosebug 和 google 建议为此使用 add_subdirectory 但这不起作用。在我的 CMakeLists 中,make depends 和几个我已经使用过的项目 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 是 运行。无法 select 为 运行 项目,因为 Qt Creator 将根 CMakeLists 视为只有一个项目。

备注

Correspound link to question in forum.qt.io

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

根目录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 是否能进一步帮助您。