CMake攻略

CMakeLists

project()

project(项目名 LANGUAGES 使用的语言列表...)
  • C:C语言
  • CXX:C++语言

find_package()

样例

find_package(Qt5 COMPONENTS Core Widgets REQUIRED)

添加QT资源文件.qrc

set(QRC_SOURCE_FILES Resources.qrc)
qt5_add_resources(QRC_FILES ${QRC_SOURCE_FILES})
SOURCE_GROUP("Resource Files" FILES ${QRC_SOURCE_FILES})

Qt Cmake添加*.qrc资源文件

识别ui文件

QT5_WRAP_UI(WRAP_FILES ${UI_FILES})

CMake+Qt5.15 配置ui及qrc文件

自动生成包含 Qt 元对象代码的 C++ 源文件

使用 qt5_wrap_cpp 宏来自动生成包含元对象代码的 C++ 源文件。这个宏会查找指定的源文件,自动添加 #include 头文件,并将每个包含 Q_OBJECT 宏的类对应生成一个 .moc 文件。然后将这些 .moc 文件编译为 C++ 对象文件,最终链接到可执行程序中。

qt5_wrap_cpp(MOC_SOURCES myclass.h)

cmake qt5_wrap_cpp
使用CMake构建Qt5工程

【#include包含失效,类名无法识别】问题解决方案

如果你的类继承自QObject,你的头文件中可能包含了Qt元对象系统的内容。在这种情况下,你需要确保使用Q_OBJECT宏,并且需要运行MOC来生成额外的代码。

包含库头文件

include_directories():包含库头文件

语法
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
样例
include_directories(./3rd_part/Include)

包含库lib文件

link_directories():添加链接的库文件目录Lib

语法
link_directories(directory1 directory2 ...)
样例
link_directories("./3rd_part/Lib")

link_libraries()

将库链接到稍后添加的所有目标(add_executable())。

语法
link_libraries([item1 [item2 [...]]]
               [[debug|optimized|general] <item>] ...)
样例
link_libraries("xxxx")
add_executable(TEST main.cpp)

target_link_libraries()

使用方式

该命令可以指定目标(exe或者so文件)需要包含的头文件路径,命名为 < target > 的命令必须是由 add_Executive()add_library()之类的命令创建的,并且不能是 ALIAS 目标。

语法
target_link_libraries(<target> ... <item>... ...)
target_link_libraries(<target>
                      <PRIVATE|PUBLIC|INTERFACE> <item>...
                     [<PRIVATE|PUBLIC|INTERFACE> <item>...]...)
样例
add_executable(TEST main.cpp)
target_link_libraries(TEST Qt5::Widgets)
warning

​​​​​​​target_link_libraries 会在目标程序中生成rpath, 这点请注意。

target_link_libraries() VS link_libraries()
  1. link_libraries用在add_executable之前,target_link_libraries用在add_executable之后。
  2. 推荐使用target_link_libraries()。link_libraries全局包含,向下传递(如果某个目录的 CMakeLists.txt 中使用了该指令,其下所有的子目录默认也包含)?

CMake常用命令(六)link_libraries 和 target_link_libraries 链接库

add_subdirectory():添加子工程

# 添加子工程code
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/code)

使用

此语句必须在add_executable语句之前。在完整工程编译链接后,打包输出demo工程时,需要手动删除此语句,因为客户在拿到demo工程后,不需要重新编译子项目的内容,而是直接使用库文件即可。

Qt Quick 用cmake怎么玩子项目

add_executable():指定生成可执行文件exe

使用指定的源文件来生成目标可执行文件。

语法

# 普通可执行目标文件:通过指定的源文件列表构建出可执行目标文件。
add_executable (<name> [WIN32] [MACOSX_BUNDLE]
      		[EXCLUDE_FROM_ALL]
      		[source1] [source2 ...])
  • name:可执行目标文件的名字,在一个cmake工程中,这个名字必须全局唯一。在make的时候会编译为可执行文件,根据平台的不同,编译后的可执行文件名可能为.exe或者。
  • WIN32:用于windows系统下创建一个以WinMain为入口的可执行目标文件(通常入口函数为main),它不是一个控制台应用程序,而是一个GUI应用程序。当WIN32选项使用的时候,可执行目标的 WIN32_EXECUTABLE会被置位ON。
  • MACOSX_BUNDLE:用于mac系统或者IOS系统下创建一个GUI可执行应用程序,当MACOSX_BUNDLE选项使用的时候,可执行目标的MACOSX_BUNDLE会被置位ON。
  • EXCLUDE_FROM_ALL:用于指定可执行目标是否会被构建,当该选项使用的时候,可执行目标不会被构建。
  • [source1] [source2 …]:构建可执行目标文件所需要的源文件。也可以通过target_sources()继续为可执行目标文件添加源文件,要求是在调用target_sources之前,可执行目标文件必须已经通过add_executable或add_library定义了。
# 导入可执行目标文件:
add_executable (<name> IMPORTED [GLOBAL])
  • 将工程外部的可执行目标文件导入进来,会有任何构建可执行目标文件的动作发生。
  • 如果不指定GLOBAL,则可执行目标文件的范围为文件创建的目录及子目录;指定GLOBAL则会将范围扩大到整个工程。
  • IMPORTED选项指定后,属性IMPORTED会被置为TRUE,在工程内构建的可执行目标文件的属性IMPORTED会被置为FALSE。
# 别名可执行目标文件:为可执行目标文件创建一个别名。
add_executable (<name> ALIAS <target>)

Cmake命令之add_executable介绍

set() 设置变量值

 #设置普通变量
set(<variable> <value>... [PARENT_SCOPE])
#设置缓存条目
set(<variable> <value>... CACHE <type> <docstring> [FORCE]) 
#设置环境变量
set(ENV{<variable>} [<value>]) 

环境变量

cmake-env-variables

set_target_properties():为一个目标设置属性

语法

set_target_properties(target1 target2 ...
                      PROPERTIES prop1 value1
                      prop2 value2 ...)

样例

更改生成exe的名称。

set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "xxx")

aux_source_directory() 自动构建源文件(.cpp)列表

语法

aux_source_directory(< dir > < variable >)

样例

aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} ALL_SOURCE)

file()

file(GLOB ALL_SOURCE "*.cpp" "*.c")
file(GLOB_RECURSE ALL_SOURCE "*.cpp" "*.c")  # 递归遍历

warning

  • 临时创建的build目录不要放在CMakeLists.txt文件的同目录或者子目录下。
    因为cmake在编译过程中也会产生临时的cpp文件,这样这些临时文件又被包括进去,就会报错,所以需要在外层目录编译。

  • 如果添加新文件,CMake不会自动重建。

CMake获取目录下所有源文件

其它技巧

设置默认构建类型为 Release 模式

if (NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif()

避免在Windows上出现bug

if (WIN32)
    add_definitions(-DNOMINMAX -D_USE_MATH_DEFINES)
endif()

让编译带有缓存,提升编译速度

if (NOT MSVC)
    find_program(CCACHE_PROGRAM ccache)
    if (CCACHE_PROGRAM)
        message(STATUS "Found CCache: ${CCACHE_PROGRAM}")
        set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_PROGRAM})
        set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE_PROGRAM})
    endif()
endif()

常用变量

变量名释义备注
CMAKE_CURRENT_SOURCE_DIR当前CMakeLists.txt 所在的源码目录
CMAKE_CURRENT_BINARY_DIR输出目录路径
CMAKE_BINARY_DIR构建树的顶层路径
CMAKE_SOURCE_DIR最外层根目录不建议使用,项目无法作为其它项目子模块使用
PROJECT_NAMEproject命令传递的工程名参数
PROJECT_SOURCE_DIR指向构建工程的全路径
PROJECT_BINARY_DIR指向当前编译工程构建的全路径
CMAKE_PROJECT_NAME根项目的项目名
CMAKE_COMMAND指向CMake可执行文件的完整路径
CMAKE_HOME_DIRECTORY指向源码树顶层的路径
CMAKE_PROJECT_NAME当前工程的工程名
CMAKE_ROOTCMake的安装路径
CMAKE_SOURCE_DIR源码树的顶层路径
CMAKE_VERSIONcmake的完整版本号
<PROJECT-NAME>_BINARY_DIR指向当前编译工程构建的全路径
<PROJECT-NAME>_SOURCE_DIR指向构建工程的全路径
<PROJECT-NAME>_VERSION项目的完整版本号

Problems

QTCreator中报错“error: unknown type name xxx”

关于插件 —> C++ —> 取消勾选ClangCodeModel
在这里插入图片描述

CMake各种项目配置变量的设置及作用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值