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()



1176

被折叠的 条评论
为什么被折叠?



