cmake是一个跨平台项目生成工具,他根据不同的平台从源代码中生成相应的项目工程,可以生成包括makefile,vs等项目文件。
CMake的使用
以生成makefile为例 cmake dir
: 将在dir中寻找CMakeLists.txt文件,并在当前所在目录生成工程文件 make
: 在当前目录寻找makefile文件,对整个工程项目进行构建
CMakeLists.txt
这个文本文件描述了需要生成的源文件,以及怎么生成项目文件。 通过一系列的指令描述。
指令
project (name)
创建两个变量: - _BINARY_DIR : 二进制文件保存目录 - _SOURCE_DIR : 源代码目录
set (var val)
设置变量
add_executable (name srclist)
name为需要编译成的可执行文件的名称
srclist为需要编译的源文件列表
add_library (name [SHARED|STATIC|MODULE] scrlist)
生成库文件 name 为生成的库文件的名称.
scrlist 为需要编译的源文件.
[SHARED|STATIC|MODULE] 制定为动态/静态库.
add_subdirectory (src_dir [binary_dir] [EXCLUDE_FROM_ALL])
添加源文件子目录
set_target_properties (target1 target2 ...PROPERTIES prop1 value1 prop2 value2 ...)
设置目标属性
include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
添加头文件搜索目录 [AFTER|BEFORE]来决定是添加到所有目录之前还是之后
link_directories(dirs)
添加库文件搜索目录
add_definitions (d)
添加宏定义
add_dependencies (target depend-target1 ...)
添加依赖 确保target会在depend-target之后才编译
aux_source_directory (dir var)
搜索dir目录下的所有源文件然后添加到var变量中去
target_link_libraries (target libs)
将target链接库文件
message ([SEND_ERROR | STATUS | FATAL_ERROR] messages)
输出消息
cmake_minimum_required(VERSION2.5 FATAL_ERROR)
设置cmake的最低要求版本为2.5
exec_program (exe_dir ARGS ... OUTPUT_VARIABLE ... RETURN_VALUE ...)
执行程序,传入参数ARGS,输出OUTPUT_VARIABLE,返回RETURN_VALUE
include (cmake_file)
加载CMakeLists.txt文件或cmake预定义模块
find_*
find_file (<VAR> name path...)
寻找文件储存到var中find_library (<VAR> name path...)
find_path (<VAR> name path...)
find_program (<VAR> name path...)
find_package (<name> [major.minor] [QUIET][NO_MODULE] [[REQUIRED|COMPONENTS] [componets...]])
: 调用Find.cmake模块
install (TARGETS ... [[ARCHIVE|LIBRARY|RUNTIME] [DESTINATION <dir>][PERMISSIONS permissions...][CONFIGURATIONS[Debug|Release|...]][COMPONENT <component>][OPTIONAL]] [...])
将target安装到指定目录,需要使用指令make install
内置变量
- CMAKE_MAJOR_VERSION
- CMAKE_MINOR_VERSION
- CMAKE_PATCH_VERSION
- CMAKE_SYSTEM : 系统名称
- CMAKE_SYSTEM_NAME : 不包括版本号的系统名称
- CMAKE_SYSTEM_VERSION
- CMAKE_SYSTEM_PROCESSOR : 处理器
- UNIX : 包括mac 和 cygwin
- WIN32 : 包括cygwin
- CMAKE_C_FLAGS : c编译选项
- CMAKE_CXX_FLAGS : cxx编译选项
流程控制
IF(cond) ELSEIF(cond) ENDIF(cond)
WHILE(cond) ENDWHILE(cond)
FOREACH(loop_var arg1 arg2 ...) ENDFOREACH(loop_var)
FOREACH(loop_var RANGE start stop [step]) ENDFOREACH(loop_var)
FOREACH(loop_var RANGE total) ENDFOREACH(loop_var)
杂项
- 可以通过
${变量名}
来获取变量的值
一个实例
cmake_minimum_required (VERSION 3.12)
project (FirstTestApp)
#设置编译flags
set(CMAKE_C_FLAGS "-m64")
set(CMAKE_CXX_FLAGS "-std=c++11 -m64")
set(LIB_DIR "/opt/local/lib")
#添加头文件目录和库文件目录
include_directories(. /opt/local/include ./classes ./components ./math ./singletons)
link_directories(${LIB_DIR})
#添加源文件
aux_source_directory(. SRC_LIST)
aux_source_directory(./classes SRC_LIST)
aux_source_directory(./components SRC_LIST)
aux_source_directory(./math SRC_LIST)
aux_source_directory(./singletons SRC_LIST)
aux_source_directory(./glad/src SRC_LIST)
#message(STATUS ${SRC_LIST})
message(STATUS "[MSG]system:${CMAKE_SYSTEM}")
set(FirstTestApp_BINARY_DIR ${FirstTestApp_BINARY_DIR}/output)
message(${FirstTestApp_BINARY_DIR})
#添加可执行文件
add_executable(FirstTestApp ${SRC_LIST})
#寻找相应的库文件
find_library(GLFW_LIB glfw3 ${LIB_DIR})
find_library(OPENGL_LIB OpenGL ${LIB_DIR})
find_library(COCOA_LIB Cocoa ${LIB_DIR})
find_library(IOKIT_LIB IOKit ${LIB_DIR})
find_library(COREFOUNDATION_LIB CoreFoundation ${LIB_DIR})
find_library(COREVIDEO_LIB CoreVideo ${LIB_DIR})
#执行链接
target_link_libraries(FirstTestApp ${GLFW_LIB} GL X11 pthread Xrandr Xi dl ${OPENGL_LIB} ${COCOA_LIB} ${IOKIT_LIB} ${COREFOUNDATION_LIB} ${COREVIDEO_LIB})