前提概要:在看本章之前,需要预备一定cmake知识,只要看完cmake官网的tutorial教程即可。
以下是最简单的qt CMakeLists.txt文件:
cmake_minimum_required(VERSION 2.8.12)
project(untitled1)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
find_package(Qt5Core)
add_executable(${PROJECT_NAME} "main.cpp" "cc.cpp")
target_link_libraries(${PROJECT_NAME} Qt5::Core)
好的,让我们一行行说起。
1. cmake_minimum_required(VERSION 2.8.12)
定义使用cmake的最小版本
2. set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
相当于定义宏类似情况,会被QT模块所使用
3. find_package(Qt5Core)
这一行很重要,查找包含Qt5Core的库包,一般情况下我们会使用CMAKE_PREFIX_PATH环境变量来确定搜索路径开始查找,这个环境变量在项目的构建设置当中看到。CMAKE_PREFIX_PATH指向当前qt库的根目录,然后cmake会在 ${CMAKE_PREFIX_PATH}/bin ${CMAKE_PREFIX_PATH}/lib下查找,根据这个线索找到如下:
没错,在lib/cmake文件夹当中找到了对应文件Qt5CoreConfig.cmake(格式为 包名Config.cmake),如此以来就找到了这个包,并获取包的相关信息。可以用 包名_FOUND这个属性来判断是否查找到
if(Qt5Core_FOUND)
message(STATUS "没有查找到Qt5Core包")
endif()
4. add_executable(${PROJECT_NAME} "main.cpp" "cc.cpp") 编译出可执行文件以及要用的源文件
5. target_link_libraries(${PROJECT_NAME} Qt5::Core)
这个是核心,第一个参数${PROJECT_NAME}是可执行文件名,不用多说,关键是第二个参数,看起来好像又有什么格式,其实并不是的,Qt5::Core也仅仅只是生成库的名字,qt约定俗称的格式是Qt${QT_VERSION_MAJOR}::模块名。我们可以从find_package命令下找到的Qt5CoreConfig.cmake找到
其中一行:add_library(Qt5::Core SHARED IMPORTED),是不是一下子就明白了为什么要这么写呢?
哇!这是不是很多事情就突然明朗了呢?
从总体感受来说,cmake(CMakeLists.txt)的使用确实比qmake(pro文件)复杂的多,但是带来的是更多的便捷、跨平台、灵活,通用!