深入浅出(一)CMake应用 CMakelists.txt详解

1. CMake简介

CMake是一个跨平台的安装(编译)工具,CMake 可以编译源代码、制作程序库、产生适配器(wrapper)、还可以用任意的顺序建构执行档。

地址
CMake官网https://cmake.org
CMake官方帮助文档https://cmake.org/cmake/help/book/mastering-cmake/
CMake3.7官方教程https://www.w3cschool.cn/doc_cmake_3_7/

待补充CMake的版本及安装相关内容!!!

2. CMakeLists.txt 框架

2.1 目录结构及框架

目录结构

| -- build
| -- src
     | -- CMakeLists.txt
     | -- main.cpp

cmakelists.txt框架

##################### 工程配置部分 #####################
cmake_minium_required(VERSION num) #指定CMake的最小版本
project(cur_project_name)          #设置工程名称
#这个命令不是强制性的,它会引入两个变量 demo_BINARY_DIR 和 demo_SOURCE_DIR
#同时,cmake 自动定义了两个等价的变量 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR。


set(CMAKE_CXX_FLAGS "xxx")  #设置编译器类型,如-std=c+11
set(CMAKE_BUILD_TYPE)       #设定编译模式,如DEBUG/RELEASE

##################### 结构框架部分 #####################
add_compile_definitions(COMPILE_DEFINITIONS=64)  #添加预处理器定义
add_definations(-D Macro_Definition)             #添加宏定义
#添加src目录下的头文件
include_directories(${PROJECT_SOURCE_DIR}/src)
#获取工程下的文件
file(GLOB_RECURSE HEADERS ${PROJECT_SOURCE_DIR}/*.h
                          ${PROJECT_SOURCE_DIR}/src/*.h)
file(GLOB_RECURSE SOURCES ${PROJECT_SOURCE_DIR}/*.cpp
                          ${PROJECT_SOURCE_DIR}/src/*.cpp)
file(GLOB_RECURSE FORMS   ${PROJECT_SOURCE_DIR}/*.ui
                          ${PROJECT_SOURCE_DIR}/src/*.ui)
file(GLOB_RECURSE INLS    ${PROJECT_SOURCE_DIR}/*.inl
                          ${PROJECT_SOURCE_DIR}/src/*.inl)
#增加子目录模块
add_subdirectory(src/sub_dir1)
add_subdirectory(src/sub_dir2)

##################### 依赖执行部分 #####################
find_package(lib_name VERSION REQUIRED)       #引入外部库
add_library(<name> [lib_type] source_name)    #生成库类型(动态.so.dll/静态.a)
include_directories(${lib_name_INCLUDE_DIRS})
add_excutable(cur_project_name main.cpp)
target_link_libraries(${lib_name_LIBRARIES})


##################### 其他辅助部分 #####################

function(function_name arg)      #定义一个函数
AUX_SOURCE_DIRECTORY(PATH src_list) #查找当前目录所有文件并存储到变量src_list中
FOREACH(one_dir ${src_list})
        MESSAGE(${one_dir})
ENDFOREACH(one_dir)

add_compile_options()     #添加编译选项

3. CMake Gui的使用

  1. CMake框架基本应用
    4.1 CMake框架 - 构建基本工程
    4.2 CMake框架 - 构建结构分层工程

参考文献——都是很不错的文章

  1. CMake基础语法与应用总结归纳
  2. CMake——CMakeLists.txt的详解
  3. 知乎:CMake应用:CMakeLists.txt完全指南

附录1 CMake常用方法

cmake设置软件图标

  1. 生成ico文件,可以直接搜索在线生成ico文件工具,尺寸可以选128x128。
  2. 编写app.rc.in文件,内容如下
#include <windows.h>
  1. 按如下目录结构存放文件
| -- build
| -- src
     | -- main.cpp
| -- resources
     | -- app.ico
     | -- app.rc.in
| -- CMakeLists.txt
  1. CMakeLists.txt中配置图标
# add rc
set(APP_RC_FILE ${CMAKE_CACHEFILE_DIR}/app.rc)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resources/app.rc.in ${APP_RC_FILE})
file(APPEND ${APP_RC_FILE} "IDI_ICON1 ICON \"resources/app.ico\" ")
  1. 向 CMake 项目中添加可执行文件
add_executable(${PROJECT_NAME}
    ${APP_RC_FILE}
    src/main.cpp
)
  1. 编译工程前会报错,应先执行CMake在进行工程构建
    在这里插入图片描述

附录2 CMake常用语法

常用变量

  • CMake布尔值常量
类型
trueTRUE,ON,YES, 1,Y,非0的值
falseFALSE,NO,OFF,0,N,IGNORE,空字符串,-NOTFOUND结尾的字符串
  • 环境变量
变量含义
GLOB_RECURSE寻访所有那些匹配目录的子路径并同时匹配查询表达式的文件
PROJECT_NAME工程名
project(cur_project_name)这个命令不是强制性的,它会引入两个变量 demo_SOURCE_DIR 和 demo_BINARY_DIR,同时,cmake 自动定义了两个等价的变量 PROJECT_SOURCE_DIR 和 PROJECT_BINARY_DIR 。
PROJECT_SOURCE_DIR当前工程根目录
PROJECT_BINARY_DIR运行cmake命令的目录,通常是${PROJECT_SOURCE_DIR}/build
CMAKE_CURRENT_SOURCE_DIR当前处理的CMakeLists.txt所在的路径
CMAKE_CURRENT_BINARY_DIRtarget编译目录
CMAKE_CURRENT_LIST_FILE输出调用这个变量的CMakeLists.txt的完整路径
CMAKE_CURRENT_LIST_LINE输出这个变量所在的行
CMAKE_MODULE_PATH定义自己的cmake模块所在的路径
CMAKE_INSTALL_PREFIX构建install的路径
$ENV{HOME}HOME环境下的目录路径
package_INCLUDE_DIR导入包头文件目录
package_LIBRAYIES导入库文件的全路径
VERSIONcmake版本号
在这里插入代码片

常用指令

  • Set
set作用
设置变量
set(variable_name value)
set(Path ${CMAKE_SOURCE_DIR})引用方式,${变量名}
设置列表
set(list_name value1 value2 … valuen)引用方式,${列表名}
配置相关
set(CMAKE_CXX_FLAGS "xxx") 设置编译器类型,如-std=c+11
set(CMAKE_BUILD_TYPE) 设定编译模式,如DEBUG/RELEASE
测试: 打印变量值message("var=${var}")
  • add_definations
环境变量作用
add_definations(-D Macro_Definition)添加宏定义
-GG应该是Generator的意思,该语句可以设置IDE,比如Xcode
-D用来设置编译器宏定义
  • 功能函数
功能函数作用
include_directories(PATH)添加PATH目录下的头文件
file(GLOB_RECURSE name PATH)获取工程PATH目录下的文件
add_subdirectory(PATH)增加子目录模块
find_package(lib_name VERSION REQUIRED) 引入外部库
add_library(<name> [lib_type] source_name)
add_library(common STATIC util.cpp) # 生成静态库
add_library(common SHARED util.cpp) # 生成动态库或共享库
生成库类型(动态.so.dll/静态.a)
在 Linux 下是:
    demo
    libcommon.a
    libcommon.so
在 Windows 下是:
    demo.exe
    common.lib
    common.dll
link_libraries(${lib_name_LIBRARIES})用在add_executable之前,用来链接静态库
target_link_libraries(${lib_name_LIBRARIES})用在add_executable之后,添加可执行文件所需要的库,即按照header file + .lib + .dll方式隐式调用动态库的.lib库
AUX_SOURCE_DIRECTORY(PATH src_list)查找当前目录所有文件并存储到变量src_list中
add_compile_options()添加编译选项
function(function_name arg)定义一个函数,待写示例
add_executable(demo demo.cpp)生成可执行文件

附录3 常用问题解决

CMakeLists.txt 使用*时添加文件时,报错无法识别该规则

错误内容如下
ninja: error: ‘…/…/lib/*.lib’, needed by ‘YourProject.exe’, missing and no known rule to make it

# 错误书写方式
set(LIBRARIES
    path/lib/*.lib
)
target_link_libraries(${PROJECT_NAME} PRIVATE ${LIBRARIES})
# 更正后书写方式
file(GLOB TEST_LIB ${LIBRARY_DIR}/lib/*.lib)

set(LIBRARIES
    ${TEST_LIB}
    # your其他lib
    # ……
)
target_link_libraries(${PROJECT_NAME} PRIVATE ${LIBRARIES})
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小老鼠不吃猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值