文章目录
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})
识别ui文件
QT5_WRAP_UI(WRAP_FILES ${UI_FILES})
自动生成包含 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()
- link_libraries用在add_executable之前,target_link_libraries用在add_executable之后。
- 推荐使用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工程后,不需要重新编译子项目的内容,而是直接使用库文件即可。
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>)
set() 设置变量值
#设置普通变量
set(<variable> <value>... [PARENT_SCOPE])
#设置缓存条目
set(<variable> <value>... CACHE <type> <docstring> [FORCE])
#设置环境变量
set(ENV{<variable>} [<value>])
环境变量
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不会自动重建。
其它技巧
设置默认构建类型为 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_NAME | project命令传递的工程名参数 | |
PROJECT_SOURCE_DIR | 指向构建工程的全路径 | |
PROJECT_BINARY_DIR | 指向当前编译工程构建的全路径 | |
CMAKE_PROJECT_NAME | 根项目的项目名 | |
CMAKE_COMMAND | 指向CMake可执行文件的完整路径 | |
CMAKE_HOME_DIRECTORY | 指向源码树顶层的路径 | |
CMAKE_PROJECT_NAME | 当前工程的工程名 | |
CMAKE_ROOT | CMake的安装路径 | |
CMAKE_SOURCE_DIR | 源码树的顶层路径 | |
CMAKE_VERSION | cmake的完整版本号 | |
<PROJECT-NAME>_BINARY_DIR | 指向当前编译工程构建的全路径 | |
<PROJECT-NAME>_SOURCE_DIR | 指向构建工程的全路径 | |
<PROJECT-NAME>_VERSION | 项目的完整版本号 |
Problems
QTCreator中报错“error: unknown type name xxx”
关于插件 —> C++ —> 取消勾选ClangCodeModel