使用过程:
•1)编写 CmakeLists.txt。
•2)执行命令“cmake PATH”或者“ccmake PATH”生成 Makefile ( PATH 是 CMakeLists.txt
所在的目录 )。
•3)使用 make 命令进行编译。
1、单目录多源文件工程的CMake
project(demo) # 项目信息,此项可不写
cmake_minimum_required(VERSION 2.8) #CMake最低版本号要求
aux_source_directory(. DIR_SRCS)#查找当前目录下的所有源文件,#并将名称保存到DIR_SRCS变量
add_executable(main ${DIR_SRCS})#指定生成目标,main为生成的可执行文件名,可修改
2. 多目录多文件工程的CMake
假设当前目录包含子目录math,目录结构如下:
. #根目录
|–main.cpp
|–math #子目录
|–MathFunctions.cpp
|–MathFunctions.h
需要在根目录和子目录math中分别建立 CMake文件,结构如下:
|–CmMakelists.txt #根目录下的Cmake
|–main.cpp
|–math
|–CMakelists.txt #子目录下的CMake
|–MathFunctions.cpp
|–MathFunctions.h
根目录下的CMakeLists.txt文件编写:
project(demo) # 项目信息
cmake_minimum_required(VERSION 2.8) # CMake最低版本号要求
aux_source_directory(. DIR_SRCS) # 查找当前目录下的所有源文件,并将名称保存到DIR_SRCS变量
add_subdirectory(math) # 添加math子目录
add_executable(demo ${DIR_SRCS}) # 指定生成目标
target_link_libraries(demo MathFunctions) # 添加链接库,指明可执行文件 main 需要连接一个名为MathFunctions的链接库
子目录下的CMakeLists.txt文件编写:
aux_source_directory(. DIR_LIB_SRCS) # 查找当前目录下的所有源文件,并将名称保存到DIR_LIB_SRCS变量
add_library(MathFunctions ${DIR_LIB_SRCS}) # 生成链接库
命令格式及示例:
cmake_minimum_required:
设置项目要求的CMake最低版本号,注意在project之前调用该命令,一般在CMakeLists.txt文件开头调用。命令格式为:
cmake_minimum_required(VERSION major.minor[.patch[.tweak]] [FATAL_ERROR])
例:
cmake_minimum_required(VERSION 2.8.5)
aux_source_directory:
命令格式为:aux_source_directory(<dir> <variable>)#查找指定目录dir中所有源文件的名称,并将列表存储在提供的variable中。
例:
aux_source_directory(. DIR_SRCS)
add_executable:使用指定的源文件给项目添加一个可执行文件。
命令格式为:
add_executable(<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])
参数解释:https://www.cnblogs.com/alphagl/p/6280061.html
例:
add_executable(HelloCMake hello_cmake.c)
add_subdirectory:
例:
add_subdirectory(${SRC_ROOT}) #向构建中添加子目录${SRC_ROOT}。
add_library:
使用指定的源文件生成一个库。命令格式为:
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])
例:
add_library(HelloCMake hello_cmake.c)
target_link_libraries:
将给定的库链接到一个目标上。
命令格式为:
target_link_libraries(<target> ... <item>... ...)
例:
target_link_libraries(luacocos2d cocos2d)
set命令 ;
定义格式:SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
例1:
set(libs "${CMAKE_SOURCE_DIR}/src/main/jnilibs")# 定义了一个变量libs,变量的值为${CMAKE_SOURCE_DIR}/src/main/jnilibs,其中CMAKE_SOURCE_DIR 是一个cmake内置变量,指定了CMakeLists.txt所在的目录
例2:
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/src/main/jnilibs/${ANDROID_ABI}) #这个命令用于给CMAKE_LIBRARY_OUTPUT_DIRECTORY宏赋值,该宏指定了cmake编译输出文件的目录为${PROJECT_SOURCE_DIR}/src/main/jnilibs/${ANDROID_ABI},其中PROJECT_SOURCE_DIR 是cmake内置宏,指向构建工程的全路径
add_definitions:为源文件的编译添加由-D引入的宏定义。
命令格式为:add_definitions(-DFOO -DBAR ...)
例:
add_definitions(-DWIN32)
add_dependencies:
使顶级目标依赖于其他顶级目标,以确保它们在该目标之前构建。这里的顶级目标是由add_executable,add_library或add_custom_target命令之一创建的目标。
例:
add_custom_target(mylib DEPENDS ${MYLIB})
add_executable(${APP_NAME} ${SRC_LIST})
add_dependencies(${APP_NAME} mylib)
configure_file:
将文件复制到其他位置并修改其内容
其它命令查考:https://www.cnblogs.com/alphagl/p/6280061.html
常用变量:
使用${}进行变量的引用。例如:message(${Hello_VERSION}),Hello为工程名。CMake提供了很多有用的变量。以下仅列举常用的变量:
CMAKE_BINARY_DIR:构建树的顶层路径
CMAKE_COMMAND:指向CMake可执行文件的完整路径
CMAKE_CURRENT_BINARY_DIR:当前正在被处理的二进制目录的路径。
CMAKE_CURRENT_SOURCE_DIR:指向正在被处理的源码目录的路径。
CMAKE_HOME_DIRECTORY:指向源码树顶层的路径。
CMAKE_PROJECT_NAME:当前工程的工程名。
CMAKE_ROOT:CMake的安装路径。
CMAKE_SOURCE_DIR:源码树的顶层路径。
CMAKE_VERSION:cmake的完整版本号。
PROJECT_BINARY_DIR:指向当前编译工程构建的全路径。
<PROJECT-NAME>_BINARY_DIR:指向当前编译工程构建的全路径。
<PROJECT-NAME>_SOURCE_DIR:指向构建工程的全路径。
PROJECT_SOURCE_DIR:指向构建工程的全路径。
PROJECT_NAME:project命令传递的工程名参数。
<PROJECT-NAME>_VERSION:项目的完整版本号。