1、首先用cmake_minimum_required (VERSION 3.14.1)指定所需cmake的最小版本。
2、project(name CXX C)指定工程名称,这个会影响PROJECT_SOURCE_DIR(第一个project所在的CMakelist.txt所在的文件的目录)的值
3、通用的属性可以放在单独的文件中如ToolChain.cmake,然后可以用include (ToolChain.cmake)等方式饱含。
4、set(CMAKE_VERBOSE_MAKEFILE ON/OFF)用于开关编译时的详细信息打印
5、常用变量:
指定编译选项
CMAKE_C_FLAGS : 指定gcc编译选项,如-02 ,-g,当然也可用通过add_definitions设置。
CMAKE_CXX_FLAGS:指定g++编译选项。
CMAKE_C_FLAGS_DEBUG:指定debug版本编译选项
指定链接选项
CMAKE_EXE_LINKER_FLAGS
CMAKE_MODILE_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS
CMAKE_STATIC_LINKER_FLAGS
指定编译器
CMAKE_C_COMPILER:指定C编译器,如gcc
CMAKE_CXX_COMPILER:指定C++编译器,如g++
BUILD_SHARED_LIBS:指定默认生成库文件类型,on:动态库,off 静态
CMAKE_BUILD_TYPE:设置编译类型,如Debug、Release
指定RPATH相关选项,如果为true,则关闭rpath功能
CMAKE_SKIP_RPATH;构建和安装期间
CMAKE_SKIP_BUILD_RPATH:构建期间
CMKAE_INSTALL_RPATH:安装期间
6、指定编译输出路径
set(LIBRARY_OUTPUT_PATH, $(PROJECT_SOURCE_DIR}/output) 指定库文件输出路径
set(EXEC_OUTPUT_PATH, $(PROJECT_SOURCE_DIR}/output) 指定可执行文件输出路径
CMAKE_CURRENT_BINARY_DIR 用于指定当前的二进制文件生成路径
CMAKE_CUREENT_SOURCE_DIR指定当前CMAKEFILE文件所在目录
添加依赖:
include_directories:添加头文件搜索路径,相当于-I
link_directories添加库文件搜索路径,相当于-L
aux_source_directory(dir,var) 包含目录下的所有源文件,相当于以下代码:
var=“”
set(list "*.c" “*.cpp”)
foreach(item IN LIST list)
file(GLOB_RECUSE itemfile "dir/{item}")
list(APPEND var itemfile)
endforeach()
add_subdirectory(src):添加子目录
add_executable(name, $(sourcefile)):指定编译文件,编译可执行程序
add_libarary(name,SHARED,$(sourcefile)):指定编译文件,编译库文件
target_link_libraried(name,$(dependlibs))添加依赖的库文件,相当于-l
link_libraries("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so")添加依赖库文件,相当于-I, 需要全路径,并且只能用于add_executable之前。
6.soname 设置
方法一
set_target_properties(target PROPERTIES VERSION xx SOVERSION XXX )
方法二
set(CMAKE_CXX_FLAGS " -Wl,-soname,xxx")
set_target_properties(target PROPERTIES NO_SONAME 1)
7、install
可以用install命令指定编译文件的安装以及普通文件的操作、shell命令的执行
install(TARGETS xx libxx.so libxx.a
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
INSTALL_DIR DESTINATION ${CMAKE_INSTALL_LIBDIR})
安装路径可以通过CMAKE_INSTALL_PREFIX设置
目录拷贝
install(DIRECTORY xx/cofnig DESTINATION ${CMAKE_INSTALL_PREFIX}/)
文件拷贝
install(FILES xx DESTINATION ${CMAKE_INSTALL_PREFIX}/)
files(GLOB dep_libs "xx/xx/*.so*)
install(FILES dep_libs
DESTINATION ${CMAKE_INSTALL_PREFIX}/)
编译过程中执行命令(非cmake时执行)
install(CODE "messge(\”xxxx\"))
install(CODE "execute_process(COMMAND bash -c \"cp xx/*.so ${dst} -rf\") ")
详细字段参考:
【CMake】cmake的install指令_Yngz_Miao的博客-CSDN博客_cmake install
8、重定义__FILE__,简化日志打印
add_defineitions(-Wno-builtin-macro-redefined)
function(redefine_file_micro targetname)
get_target_property(source_files, "${targetname}" SOURCES)
foreach(sourcefile ${source_files})
get_property(defs SOURCE "${sourcefile}" PROPERTUY COMPILE_DEFINITIONS)
get_filename_component(filepath "${sourcefile}" ABSOLUTE)
string(REPLACE ${PROJECT_SOURCE_DIR}/ "" relpath ${filepath})
list(APPEND defs "__FILE__=\"${relpath}\"”
set_property(SOURCE "${sourcefile}" PROPERTY COMPILE_DEFINITIONS ${defs})
endforeach()
endfunction
链接的时候调用redefine_file_micro(xxx)
9、交叉编译设置
参考:CMake: (三) 交叉编译 - 采男孩的小蘑菇 - 博客园
10、其他
message(status,"message ${xx}); 打印信息
file(MAKE_DIRECTORY xxx)创建文件