如何配置 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
视为只有一个项目。
备注
我将按以下方式构建您的项目:
根目录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 是否能进一步帮助您。
我有 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
视为只有一个项目。
备注
我将按以下方式构建您的项目:
根目录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 是否能进一步帮助您。