cmake
首先打开顶层目录CMakeList.txt
1、描述cmake_minimum_required (VERSION 2.x)最低版本要求
2、设置建立工程工程名字 使用 SET 指令,就可以构建一个自定义变量了
3、设置输出路径
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)
CMAKE_RUNTIME_OUTPUT_DIRECTORY :输出可执行文件
CMAKE_LIBRARY_OUTPUT_DIRECTORY :库文件一般.so动态库
CMAKE_ARCHIVE_OUTPUT_DIRECTORY :库文件 一般静态库
4、配置工程文件
include(config.cmake)
5、设置目标平台名字
set(TARGET_PLATFORM ${DEFAULT_TARGET_PLATFORM})
6、设置编译类型
set(CMAKE_BUILD_TYPE Debug CACHE STRING "Build type")
7、设置project版本号相关信息
如 :set(project_version "${VESION}.${AND_SO_ON}")
8、set(CMAKE_VERBOSE_MAKEFILE ON)
显示详细的原始编译信息,主要用于定位一些链接错误,看看库路径什么的是否配置对。
9、根据目标平台设置不同交叉编译环境.cmake
10、set_property:在指定域中设置一个命名属性
set_property(GLOBAL PROPERTY 目标名字 "")
如下:
set_property(<GLOBAL |
DIRECTORY [dir] |
TARGET [target1 [target2 ...]] |
SOURCE [src1 [src2 ...]] |
TEST [test1 [test2 ...]] |
CACHE [entry1 [entry2 ...]]>
PROPERTY <name>[value1 [value2 ...]])
在某个域中对零个或多个对象设置一个属性。第一个参数决定该属性设置所在的域。它必须为下面中的其中之一:
GLOBAL域是唯一的,并且不接特殊的任何名字。
DIRECTORY域默认为当前目录,但也可以用全路径或相对路径指定其他的目录(前提是该目录已经被CMake处理)。
TARGET域可命名零或多个已经存在的目标。
SOURCE域可命名零或多个源文件。注意:源文件属性只对在相同目录下的目标是可见的(CMakeLists.txt)。
TEST域可命名零或多个已存在的测试。
CACHE域必须命名零或多个已存在条目的cache.
PROPERTY后面紧跟着要设置的属性的名字。
13、include 工程上用到的头文件
如:include_directories(${PATH_INCLUDE})
14、在工程全局范围内定义相关宏
如:add_definitions(-DMACRO)
15、根据子模块目录进行相关操作
如:add_subdirectory(子目录名字)
相关cmake操作:
1 、set命令: 将一个CMAKE变量设置为给定值。
set(<variable> <value> [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])
将变量<variable>的值设置为<value>。在<variable>被设置之前,<value>会被展开。如果有CACHE选项,那么<variable>就会添加到cache中;这时<type>和<docstring>是必需的。<type>被CMake GUI用来选择一个窗口,让用户设置值。<type>可以是下述值中的一个:
FILEPATH = 文件选择对话框。
PATH = 路径选择对话框。
STRING = 任意的字符串。
BOOL = 布尔值选择复选框。
INTERNAL = (不需要GUI输入端,适用于永久保存的变量)。
如果<type>是内部的(INTERNAL),那么<value>总是会被写入到cache中,并替换任何已经存在于cache中的值。如果它不是一个cache变量,那么这个变量总是会写入到当前的makefile中。FORCE选项将覆盖cache值,从而去掉任何用户带来的改变。
如果指定了PARENT_SCOPE选项,变量<variable>将会被设置为当前作用域之上的作用域中。
如果想全局共享某变量3种方法:
1、要用set(variable value CACHE INTERNAL docstring )这种方式定义的变量会把变量加入到CMakeCache.txt然后各级目录共享会访问到这个变量。
2、set(${variable} ${value} PARENT_SCOPE) PARENT_SCOPE 放到顶层则全局,子目录可以共享
3、set_property(GLOBAL PROPERTY ${variable} "${value}" ) 在其他目录 get_property( GLOBAL PROPERTY ${variable} )
2、CMake可以通过execute_process调用shell命令或者脚本,如下:
execute_process(COMMAND <cmd1> [args1...]]
[COMMAND <cmd2> [args2...] [...]]
[WORKING_DIRECTORY <directory>]
[TIMEOUT <seconds>]
[RESULT_VARIABLE <variable>]
[OUTPUT_VARIABLE <variable>]
[ERROR_VARIABLE <variable>]
[INPUT_FILE <file>]
[OUTPUT_FILE <file>]
[ERROR_FILE <file>]
[OUTPUT_QUIET]
[ERROR_QUIET]
[OUTPUT_STRIP_TRAILING_WHITESPACE]
[ERROR_STRIP_TRAILING_WHITESPACE])
调用shell命令:execute_process(COMMAND <shell命令> WORKING_DIRECTORY <此句shell命令执行的工作目录>)
调用脚本:execute_process(COMMAND sh example.sh WORKING_DIRECTORY <example.sh所在目录>)
3、
add_custom_command :
add_custom_command(TARGET target
PRE_BUILD | PRE_LINK | POST_BUILD
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[WORKING_DIRECTORY dir]
[COMMENT comment] [VERBATIM])
This defines a new command that will be associated with building the specified target. When the command will happen is determined by which of the following is specified:
PRE_BUILD - run before all other dependencies
PRE_LINK - run after other dependencies
POST_BUILD - run after the target has been built
1、增加自定义命令来产生一个输出
2、为某个目标添加一条命令
如:add_custom_command(TARGET ${xxx}
POST_BUILD|PRE_LINK|PRE_BUILD
COMMAND xxxx
)
4、需要在cmake中创建一些目标,需要通过add_custom_target来指定。add_custom_command可以用来完成对add_custom_target生成的target的补充。
5、add_library
add_library(libName [STATIC | SHARED | MODULE]
[source1] [source2] [...])
libName库名字,该库文件会根据命令里列出[source**]源文件。而STATIC、SHARED和MODULE的作用是指定生成的库文件的类型
6、target_link_libraries
该指令的作用为将目标文件与库文件进行链接。
7、link_directories 设置库链接路径
8、string(CONCAT CMAKE_C_FLAGS ${CMAKE_C_FLAGS} " ****")
string(CONCAT CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "****")
通过上述两个命令来设置编译选项CFLAGS CPPFLAGS
9、 LDFLAGS 也可以通过下面四种选项处理
CMAKE_EXE_LINKER_FLAGS:Linker flags to be used to create executables.
CMAKE_MODULE_LINKER_FLAGS:Linker flags to be used to create modules.
CMAKE_SHARED_LINKER_FLAGS:Linker flags to be used to create shared libraries.
CMAKE_STATIC_LINKER_FLAGS:Flags to be used to create static libraries. These flags will be passed to the archiver when creating a static library.
如:通过string(CONCAT CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "****"}来设置链接选项LDFLAGS
相关参考CMake 入门实战: https://www.hahack.com/codes/cmake/