编写项目CmakeFile.txt文件常用Cmake指令

Cmake 指令是大小写无关的,参数和变量是大小写相关的

cmake 本质也是生成makefile文件。

文件名:

CmakeList.txt

cmake版本设置:cmake_minimum_required(VERSION 3.16.3)//最小支持的cmake版本

//PROJECT(项目名称 支持的语言(可省略))

项目名称设置:PROJECT(myproject)//默认支持全部语言 

操作系统与处理器架构设置

set(CMAKE_VERBOSE_MAKEFILE OFF)//关闭编译打印

set(CAMKE_SYSTEM_NAME Linux)//设置系统类型

set(CAMKE_SYSTEM_PROCESSOR arm)//设置处理器架构

设置C++标准:set(CXX_STANDARN 17)

设置全局c++的标准为使用17标准,设置完之后,cmake会尽量去找符合标准的编译器和库,但是如果找不到,也不会报错,会降级寻找,假设找到14的版本就用14的版本。假如我们的代码里面用了c++17的东西,也就是低版本的标准无法编译,那我们就加上一个强制要求,这个强制要求就使用

set(CXX_STANDARD_REQUIRED TRUE)

经常有很多编译器的扩展,不在标准c++里面,我们一般不启用。不启用的话使用

set(CXX_EXTENSION FALSE)

编译器设置

set(CAMKE_C_COMPILER  路径bin/aarch64-none-linux-gun-gcc)//设置C编译器路径

set(CAMKE_CXX_COMPILER  路径bin/aarch64-none-linux-gun-g++)设置C++编译器路径

set(CAMKE_LINKER  路径bin/aarch64-none-linux-gun-ld)设置C++编译器路径

set(CAMKE_AR  路径bin/aarch64-none-linux-gun-ar)设置C++编译器路径

set(CAMKE_STRIP  路径bin/aarch64-none-linux-gun-strip)设置C++编译器路径

message("cmake set setting over")

message([<mode>] "message text" ...)//打印信息,同事可控制Cmake 过程结束,waring

CMake中message的使用_cmake message_fengbingchun的博客-CSDN博客

编译过程增加环境变量:add_definition(-DMYPATH =${CAMKE_CURRENT_DIR} )//定义MYPATH为当前目录路径CAMKE_CURRENT_DIR

文件拷贝 file(COPY  src  dst) //拷贝src到dst

cmake的file命令_cmake file_物随心转的博客-CSDN博客

当文件名带空格时可用引号:比如 my file.txt ->"my file.txt"

install(TARGETS ${BIN_NAME} RUNTIME DESTINATION output/bin)
INSTALL(TARGETS myrun mylib mystaticlib
       RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
       LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
       ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)

可执行二进制myrun安装到${CMAKE_INSTALL_BINDIR}目录,动态库libmylib.so安装到${CMAKE_INSTALL_LIBDIR}目录,静态库libmystaticlib.a安装到${CMAKE_INSTALL_LIBDIR}目录

文件夹拷贝

install(DIRECTORY conf/ DESTINATION output/conf)

将conf/目录安装到output/conf目录,

设置编译产物路径:

set(EXECUTABLE_OUTPUT_PATH  路径) //可执行文件输出路径

set(LIBRARY_OUTPUT_PATH  路径)//.a.so 路径

设置编译产物设置:

add_executable(a.out  main.c file1.c $(SRC_DIR))

设置目标文件依赖库

target_link_libraries(a.out -la -lb)//a.out依赖liba.so与libb.so

添加.h头文件路径

include_directories($(path1)  $(path2) $(path3))

添加src子目录

add_subdirectory(path1) 

add_subdirectory(path2)

当子目录有CMakefile.txt时,编译顶层CMakeList.txt时也会编译子目录path1,path2下的CMakeFile.txt

再来看一下src目录下的CMakeLists.txt

add_subdirectory(path3) //src 目录下还有目录path3

add_library(a STATIC a.c b.c)//把a.c b.c生成liba.a

target_link_libraries(main.out PRIVATE a )//编译连接时把liba.a添加到生成main.out 中。

扫描所有文件下的.c文件

file(GLOB_RECURSE c_source  "path/*.c")

file(GLOB_RECURSE cpp_source  "path/*.cpp")

动态库与静态库生成

add_library(hello SHARED $(hello.c))//生成libhello.so 

add_library(hello STATIC$(hello.c))//生成libhello.so 

这两条不能同时存在,若同时生成静态与动态库时,使用set_target_properties

SHARED,动态库

STATIC,静态库

MODULE,在使用dyld的系统有效,如果不支持dyld,则被当做SHARED对待。
EXCLUDE_FROM_ALL参数的意思是这个不会被默认构建,除非有其他的组件依赖或者手工构建

set_target_properties(hello_static PROPERTIES OUTPUT_NAME "hello")//生成libhello.a

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

这条指令可以用来设置输出的名称,对于动态库,还可以用来指定动态库的版本和API版本

与他对应的指令是:

GET_TARGET_PROPERTY(VAR target property)
增加动态库的版本号
SET_TARGET_PROPERTIES(hello PROPERTIES VERION 1.2 SOVERSION 1)

VERSION指代动态库版本,SOVERSION指代API版本。

CMake判断语句

if(a == 0)

message("a")

else()

message("b")

endif()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值