CMake手册
CMake是一种工具,有助于简化跨不同平台的开发项目的构建过程。 CMake自动生成Makefile和Visual Studio项目文件等构建系统。
CMake是第三方工具,拥有自己的文档。 本手册的其余部分详细介绍了如何将Qt 5与CMake一起使用的细节。 使用Qt5所需的最低版本是CMake 3.1.0。
入门
使用CMake时的第一个要求是使用find_package来定位Qt附带的库和头文件。 然后可以使用这些库和头文件来构建基于Qt的库和应用程序。
在CMake中使用Qt库和头文件的推荐方法是使用target_link_libraries命令。 此命令自动添加适当的包含目录,编译定义,位置无关代码标志以及指向Windows上qtmain.lib库的链接。
要构建helloworld GUI可执行文件,通常的用法是:
cmake_minimum_required(VERSION 3.1.0)
project(testproject)
# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Instruct CMake to run moc automatically when needed
set(CMAKE_AUTOMOC ON)
# Create code from a list of Qt designer ui files
set(CMAKE_AUTOUIC ON)
# Find the QtWidgets library
find_package(Qt5Widgets CONFIG REQUIRED)
# Populate a CMake variable with the sources
set(helloworld_SRCS
mainwindow.ui
mainwindow.cpp
main.cpp
)
# Tell CMake to create the helloworld executable
add_executable(helloworld WIN32 ${helloworld_SRCS})
# Use the Widgets module from Qt 5
target_link_libraries(helloworld Qt5::Widgets)
为了使find_package成功,必须在CMAKE_PREFIX_PATH下面找到Qt 5,或者必须在CMake缓存中将Qt5 <Module> _DIR设置为Qt5WidgetsConfig.cmake文件的位置。 使用CMake的最简单方法是将CMAKE_PREFIX_PATH环境变量设置为Qt 5的安装前缀。
CMAKE_AUTOMOC设置在需要时自动运行moc。 有关此功能的更多信息,请参阅CMake AUTOMOC文档
导入目标
为每个Qt模块创建导入的目标。 应首选导入的目标名称,而不是在CMake命令(如target_link_libraries)中使用Qt5 <Module> _LIBRARIES等变量。 可以使用LOCATION属性获取库的实际路径:
find_package(Qt5Core)
get_target_property(QtCore_location Qt5::Core LOCATION)
但请注意,很少需要CMake代码中库的完整位置。 大多数CMake API都知道导入的目标,并且可以自动使用它们而不是完整路径。
Qt 5中的每个模块都有一个库目标,其命名约定为Qt5 :: <Module>,可用于此目的。
使用配置Qt的配置创建导入的目标。 也就是说,如果使用-debug开关配置Qt,则将创建具有配置DEBUG的导入目标。 如果使用-release开关配置Qt,则将创建具有RELEASE配置的导入目标。 如果Qt配置了-debug-and-release开关(Windows上的默认值),则将使用RELEASE和DEBUG配置创建导入的目标。
如果您的项目具有自定义CMake构建配置,则可能需要设置从自定义配置到调试或发布Qt配置的映射。
find_package(Qt5Core)
set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_RELEASE} -fprofile-arcs -ftest-coverage")
# set up a mapping so that the Release configuration for the Qt imported target is
# used in the COVERAGE CMake configuration.
set_target_properties(Qt5::Core PROPERTIES MAP_IMPORTED_CONFIG_COVERAGE "RELEASE")
插件也可作为CMake中的IMPORTED目标。 Qt网络,Qt SQL,Qt GUI和Qt Widgets模块具有相关的插件。 它们在Qt5 <Module> _PLUGINS变量中提供了一个插件列表
foreach(plugin ${Qt5Network_PLUGINS})
get_target_property(_loc ${plugin} LOCATION)
message("Plugin ${plugin} is at location ${_loc}")
endforeach()
变量参考
模块变量
find_package调用的结果是创建导入的目标以与target_link_libraries一起使用,一些变量将填充配置构建所需的信息,并且宏将可供使用。每个模块的导入目标的名称与前缀为“Qt5 ::”的模块名称匹配,例如Qt5 :: Widgets。所有特定于包的变量都具有一致的名称,并带有包名称的前缀。例如,如果成功找到,find_package(Qt5Widgets)将使以下变量可用:
Qt5Widgets_VERSION描述模块版本的字符串。
Qt5Widgets_LIBRARIES用于target_link_libraries命令的库列表。
Qt5Widgets_INCLUDE_DIRS与include_directories命令一起使用的目录列表。
Qt5Widgets_DEFINITIONS与add_definitions一起使用的定义列表。
Qt5Widgets_COMPILE_DEFINITIONS与COMPILE_DEFINITIONS目标属性一起使用的定义列表。
Qt5Widgets_FOUND描述模块是否成功找到的布尔值。
Qt5Widgets_EXECUTABLE_COMPILE_FLAGS构建可执行文件时要使用的标志字符串。
使用find_package调用找到的所有包都可以使用这些变量的等价物。请注意,变量区分大小写。
安装变量
此外,还有一些其他变量可用,这些变量与特定包无关,而与Qt安装本身有关。
QT_VISIBILITY_AVAILABLE描述Qt是否使用隐藏可见性构建的布尔值。
QT_LIBINFIX包含库名称中使用的中缀的字符串。
宏参考
Qt5Core宏
找到Qt5Core时可用的宏。