CMake--CMakeList.txt编写

本文介绍了CMake的基础用法,包括如何在Linux下安装cmake,使用cmake命令行参数进行编译和安装,以及CMakeLists.txt中的关键指令,如设置项目名称、生成可执行程序、添加头文件搜索路径、链接库文件等。此外,还讲解了如何定义变量、添加编译选项和控制选项,以及如何处理DEBUG信息。
摘要由CSDN通过智能技术生成

CMakeList.txt基础

cmake是用于构建、测试和软件打包的开源跨平台工具

linux下源码编译安装cmake:

  1. 下载解压
  2. ./configure生成makefile文件,make编译
  3. make install安装编译好的cmake
  4. 设置环境变量

cmake -S . -B build 执行cmake进行编译;直接cmake .所产生的文件会在当前目录下,过于杂乱,会污染项目源码
-S . 在当前目录下查找CMakeLists.txt并执行;
-B build 构建生成的路径,存放cmake时生成的临时文件,项目文件,包括编译的中间文件、输出文件;
-G "NMake Makefiles" 指定编译器
也可以直接手动创建目录,在该目录下cmake ..

cmake --build build cmake统一的编译方法,build:编译的项目文件路径
cmake --build build --config Release --config,配置项,指定Debug或Release,默认是Debug

cmake -install build对cmake所涉及到的文件(做好的cmake文件,可以直接使用的,如查找库)进行安装,build:项目文件所在的路径

指定最低版本要求

cmake_minimum_required(VERSION 2.8)

构建项目名称

project(smartswitch)//工程名smartswitch

生成可执行程序

add_executable(main main.c ${SRC_LIST})//参数:生成的可执行程序名、所依赖的文件名

向当前工程添加存放源文件的子目录,并可指定中间二进制和目标二进制的存放位置

add_subdirectory(src)
//cmake时,会进入src寻找CMakeLists.txt

源文件

将指定目录下所有源文件(所有文件,可能包含不需要的文件)保存在变量中

aux_source_directory(src SRC_LIST)//src目录,SRC_LIST变量
//新建变量存放所需源文件,set定义变量
//set(SRC_LIST
//   src/smartswitch.c
//   src/sm3.h
//   test/main.c)

头文件

向工程添加多个指定头文件搜索路径

include_directories(include)

指定项目搜索头文件路径

target_include_directories ( ${PROJECT_NAME}  PRIVATE  ${CMAKE_CURRENT_SOURCE_DIR}/include )
//需要创建项目后再使用
//需要指定 目标 和 路径 以及 属性传递 (属性传递有3个: PRIVATE, PUBLIC 和 INTERFACE),可指定多个路径

库文件

生成动态库(SHARED)或静态库(STATIC)(默认)连续使用指定库名不能相同

add_library(smartSwitch_shared SHARED ${SRC_LIST})
add_library(smartSwitch_static STATIC ${SRC_LIST})
//add_library(库名 库的属性 依赖文件)

设置最终库名,还有其他功能,如设置库的版本号等,连续使用可指定相同库名,后缀不同,.a/.so

set_target_properties(smartSwitch_shared PROPERTIES OUTPUT_NAME "smartSwitch")
set_target_properties(smartSwitch_static PROPERTIES OUTPUT_NAME "smartSwitch")

指定目录下查找库,并把库的绝对路径存于变量中 (变量名 库名 HINTS 路径)

find_library(TEST_LIB smartSwitch HINTS ${PROJECT_SOURCE_DIR}/bin)
//默认是动态库,指定:libsmartSwitch.so
//会在camke时就会查找库是否存在,可提前发现问题,不用等到链接时
//find_package库查找,link_directories()库查找,官方不建议使用

将目标文件与库文件进行链接

target_link_libraries(main ${TEST_LIB})

变量

定义变量,存放elf文件的位置设置为工程根目录下的bin目录

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

CMake自带的预定义变量

EXECUTABLE_OUTPUT_PATH 目标二进制可执行文件的存放位置
PROJECT_SOURCE_DIR 工程根目录
LIBRARY_OUTPUT_PATH 库文件默认输出路径
//CMake内置变量
//CMAKE_CURRENT_SOURCE_DTR     当前CMakeLists.txt文件所在路径
//PROJECT_NAME     对应project()中的值

其他

添加编译选项

add_compile_options(-std=c++11 -Wall)
//-Wall,编译后显示所有警告
//-w,关闭编译时的警告
//-W,只显示编译器认为会出现错误的警告

添加控制选项

//编译部分代码,宏控制
option(MYDEBUG "test001" OFF)
//宏名,描述信息,ON或OFF,可不写,默认OFF

add_definitions(-DMYDEBUG)//向C/C++编译器添加宏,相当于#define MYDEBUG

//命令行控制
cmake . -DMYDEBUG=ON

添加DEBUG信息

CMAKE_BUILD_TYPE
//Debug:用于在没有优化的情况下,使用带有调试符号构建库或可执行文件
//Release:用于构建的优化的库或可执行文件,不包含调试符号
//RelWithDebInfo:由于构建较少的优化库或可执行文件,包含调试符号
//MinSizeRel:用于不增加目标代码大小的优化方式,来构建或可执行文件
set(CMAKE_BUILD_TYPE "Debug")
//CMAKE_CXX_FLAGS_DEBUG

SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")//启用gdb
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")//启用优化1~3

//也可通过add_compile_options()添加调试信息,针对所有编译器
//修改变量值方法:CMAKE_C_FLAGS,CMAKE_CXX_FLAGS分别针对C,C++编译器

//$ENV{},获取环境变量
//set(ENV{变量名} 值),设置环境变量

//CXXFLAGS,C++编译器的编译选项
//CFLAGS,C编译器的编译选项


//判断编译器类型,如果是gcc编译器,则在编译选项中加入c++11支持
if(CMAKE_COMPILER_IS_GNUCXX)
    add_compile_options(-std=c++11)
    message(STATUS "optional:-std=c++11")   
endif(CMAKE_COMPILER_IS_GNUCXX)

示例

project
src
test

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值