配菜拼盘(2)——cmake构建项目

本文详细介绍了CMake中的关键预设变量,如系统和构建类型判断,以及项目结构的组织,包括单项目与多层项目的配置。此外,还涵盖了如何在CMake中集成Qt开发的技巧。
摘要由CSDN通过智能技术生成

傻瓜笔记,包你看懂~

1. 可直接使用的cmake预定义变量

tips:想要看具体变量值可以创建cmake文件加入message(CMAKE_SYSTEM_NAME),重新加载cmake时可以输出变量值

CMAKE_SYSTEM_NAME			目标系统,运行时判断代码机器系统(linux/windows)
CMAKE_HOST_SYSTEM_NAME		开发系统,判断当前运行CMake的主机系统(linux/windows)
CMAKE_SYSTEM_VERSION		目标系统的版本号(同命令uname -r获取数据) 
CMAKE_GENERATOR				使用的生成器的名称(Ninja/Visual Studio 16 2019")
CMAKE_BUILD_TYPE			返回当前程序的构建类型(debug/release)
CMAKE_SOURCE_DIR			CMakeLists.txt文件的顶层源代码目录
CMAKE_BINARY_DIR			CMake编译目录,即构建中生成二进制文件所在目录(build-release)
CMAKE_CURRENT_LIST_FILE		当前正在处理的CMakeLists.txt文件的到文件的绝对路径
CMAKE_CURRENT_LIST_DIR		当前正在处理的CMakeLists.txt文件的到目录的绝对路径
CMAKE_CURRENT_SOURCE_DIR	当期正在处理的CMakeLists.txt文件的到目录的绝对路径

2. 一般情况下开发工具创建新项目自动生成

tips:单个项目必须包含'project()'和'add_executable()',多层项目的上层cmake文件不必包含

cmake_minimum_required(VERSION 3.24)	#限制使用编译最低cmake版本
project(untitled)	#项目名称
set(CMAKE_CXX_STANDARD 11)	#设置c++标准c11
add_executable(untitled main.cpp)	#生成可执行文件名 编译源文件

3. 项目顶层CMakeLists.txt常用写法

tips:常用文件路径表示方式使用预定义变量加相对路径表示,例 ${CMAKE_CURRENT_SOURCE_DIR}/../dir

cmake_minimum_required(VERSION 3.24)
project(main_pro)
set(CMAKE_CXX_STANDARD 11)

include(文件路径/othercmakefile.cmake)	#引入其他文件内容到当前位置(通常是一些系统判断等,需要放在前边)

if(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux")	#使用预定义变量区分系统(适用于跨平台程序) linux系统
#if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")	#同上判断
	#Linux打开以下两行设置,在release编译模式下可以进行断点调试
	set(CMAKE_CXX_FLAGS "-g")
    set(CMAKE_CXX_FLAGS_RELEASE "-O0")
	
    add_definitions(-DMYLINUX)	#定义宏定义变量(格式-D后跟变量名),变量可在代码中使用,方法#ifdef MYLINUX *** #endif
else()	#如果是适配Windows和Linux,那else就是Windows系统,也可以使用elseif判断系统
	#Windows添加这段代码,在release编译模式下可以进入断点调试
    ADD_DEFINITIONS( /Zi )
    ADD_DEFINITIONS( /Od )
    set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG")
    set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG")
	
	add_definitions(-DMYWINDOWS)	#定义宏定义变量MYWINDOWS
endif()

if(CMAKE_BUILD_TYPE MATCHES "Debug")	#判断编译类型 debug
    add_definitions(-DMYDEBUG)
    set(BUILD_TYPE debug)	#使用set设置BUILD_TYPE宏代表debug编译模式,通常用该变量进行程序运行区分链接库类型
else()
    add_definitions(-DMYRELEASE)
    set(BUILD_TYPE release)
endif()

#设置程序输出路径
set(LIBRARY_OUTPUT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../bin/${BUILD_TYPE}")	#使用BUILD_TYPE进行区分存放路径
set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../bin/${BUILD_TYPE}")

include_directories(文件路径)	#引入头文件
link_directories(链接库路径)	#程序运行时链接库的路径

add_subdirectory(subproject_name)	#添加子项目工程
add_subdirectory(...)

add_dependencies(main_pro subproject_name1 subproject_name2 ...)	#程序构建时的依赖关系main_pro依赖于subproject_name1,需要先构建subproject_name1项目

4. 子项目——独立进程

cmake_minimum_required(VERSION 3.24)
project(subproject_name1)
set(CMAKE_CXX_STANDARD 11)

include_directories(文件路径)
link_directories(链接库路径)

add_executable(subproject_name1 main.cpp)
#add_dependencies(subproject_name1 subproject_name2)	#可以在顶层cmake中设置,也可以在每个子项目中指定依赖

if(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux")
    target_link_libraries(subproject_name1 -lsqlite3)	#运行时动态链接程序使用的三方库
else()	#Windows
    #target_link_libraries(subproject_name1 sqlite3.lib)	#注意linux和Windows引用库写法不同
endif()

5. 子项目——生成库

tips:
linux 动态库subproject_name2.so    静态库subproject_name2.a
windows 动态库subproject_name2.dll    静态库subproject_name2.lib

cmake_minimum_required(VERSION 3.24)
project(subproject_name2)
set(CMAKE_CXX_STANDARD 11)

add_definitions(-DMY_LIBRARY)	#定义该项目将生成动态库

include_directories(文件路径)
link_directories(链接库路径)

add_library(subproject_name2 SHARED sub.cpp)	#动态库SHARED 静态库STATIC 
#add_dependencies(subproject_name2 ...)

if(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux")
    target_link_libraries(subproject_name2 -lpthread)
else()
    target_link_libraries()
endif()

6. cmake构建Qt界面程序用法

tips:以下用法在前边基础上进行添加

——项目顶层添加
include(FindPackage)	#包含cmake的标准模块FindPackage

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOMOC ON)
find_package(Qt5 COMPONENTS Core Widgets Gui WebEngine WebEngineWidgets REQUIRED)	#COMPONENTS后跟项目中要使用的qt模块

——子项目添加
add_executable(main_widget main_widget.cpp main_widget.ui)	#源文件添加ui界面文件

if(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux")	#在linux和Windows中链接qt库的写法相同,区别在于其他三方库
    target_link_libraries(main_widget Qt5::Widgets Qt5::WebEngine Qt5::WebEngineWidgets)
else()
    target_link_libraries(main_widget Qt5::Widgets Qt5::WebEngine Qt5::WebEngineWidgets)
endif()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值