CMake是一个跨平台的安装编译工具,能够用简单的语句来描述全部平台的安装(编译过程)。他可以输出各类各样的makefile或者project文件,能测试编译器所支持的C++特性,相似UNIX下的automakec++
main.ccbash
#include <stdio.h> #include <stdlib.h> double power(double base, int exponent) { int result = base; int i; if (exponent == 0) { return 1; } for (i = 1; i < exponent; ++i) { result = result * base; } return result; } int main(int argc, char *argv[]) { if (argc < 3) { printf("Usage: %s base exponent \n", argv[0]); return 1; } double base = atof(argv[1]); int exponent = atoi(argv[2]); double result = power(base, exponent); printf("%g ^ %d is %g\n", base, exponent, result); return 0; }
当前目录下的CMakeLists.txt(CMakeLists 不区分大小写)app
# 版本最低要求 cmake_minimum_required(VERSION 2.8) # 项目信息 project(Demo01) # 指定生成目标 add_executable(Demo01 main.cc)
执行命令ide
cmake . # 执行cmake,自动生成对应的makefile make # 生成二进制文件Demo01
编译输出工具
➜ cmakedemo cmake . -- The C compiler identification is AppleClang 9.0.0.9000039 -- The CXX compiler identification is AppleClang 9.0.0.9000039 -- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done -- Generating done -- Build files have been written to: /Users/fanghao/Desktop/cmakedemo ➜ cmakedemo make Scanning dependencies of target Demo01 [ 50%] Building CXX object CMakeFiles/Demo01.dir/main.cc.o [100%] Linking CXX executable Demo01 [100%] Built target Demo01 ➜ cmakedemo ./Demo01 5 4 5 ^ 4 is 625
修改项目结构以下:测试
➜ cmakedemo tree . ├── CMakeLists.txt ├── MathFunction.cc ├── MathFunctions.h └── main.cc 0 directories, 4 files
CMakeLists.txt也应当添加多个文件ui
# 版本最低要求 cmake_minimum_required(VERSION 2.8) # 命令不区分大小写 # 项目信息 project(Demo02) #把源文件变成变量 aux_source_directory(. DIR_SRCS) # 指定生成目标 add_executable(Demo02 ${DIR_SRCS})
修改项目结构以下:code
➜ cmakedemo tree . ├── CMakeLists.txt ├── main.cc └── math ├── CMakeLists.txt ├── MathFunction.cc └── MathFunctions.h 1 directory, 5 files
cmakedemo目录下的CMakeLists.txtorm
# 版本最低要求 cmake_minimum_required(VERSION 2.8) # 命令不区分大小写 # 项目信息 set(NAME Demo03) project(${NAME}) # 添加math子目录,会执行math目录下的cmake add_subdirectory(math) # 指定生成目标 add_executable(${NAME} main.cc) # 添加连接库 target_link_libraries(${NAME} MathFunctions)
math目录下的CMakeLists.txtci
# 查找当前目录下的全部源文件 # 并将名称保存到 DIR_LIB_SRCS 变量 aux_source_directory(. DIR_LIB_SRCS) # 生成连接库 add_library (MathFunctions ${DIR_LIB_SRCS})
此时的输出,注意编译了子模块
➜ cmakedemo cmake . -- The C compiler identification is AppleClang 9.0.0.9000039 -- The CXX compiler identification is AppleClang 9.0.0.9000039 -- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchai ns/XcodeDefault.xctoolchain/usr/bin/cc-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchai ns/XcodeDefault.xctoolchain/usr/bin/cc -- works-- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolch ains/XcodeDefault.xctoolchain/usr/bin/c++-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolch ains/XcodeDefault.xctoolchain/usr/bin/c++ -- works-- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done -- Generating done -- Build files have been written to: /Users/fanghao/Desktop/cmakedemo ➜ cmakedemo make Scanning dependencies of target MathFunctions [ 25%] Building CXX object math/CMakeFiles/MathFunctions.dir/MathFunction.cc.o [ 50%] Linking CXX static library libMathFunctions.a [ 50%] Built target MathFunctions Scanning dependencies of target Demo03 [ 75%] Building CXX object CMakeFiles/Demo03.dir/main.cc.o [100%] Linking CXX executable Demo03 [100%] Built target Demo03 ➜ cmakedemo ./Demo03 3 4 3 ^ 4 is 81
生成的文件
➜ cmakedemo tree -L 2 . ├── CMakeCache.txt ├── CMakeFiles │ ├── 3.11.3 │ ├── CMakeDirectoryInformation.cmake │ ├── CMakeOutput.log │ ├── CMakeTmp │ ├── Demo03.dir │ ├── Makefile.cmake │ ├── Makefile2 │ ├── TargetDirectories.txt │ ├── cmake.check_cache │ ├── feature_tests.bin │ ├── feature_tests.c │ ├── feature_tests.cxx │ └── progress.marks ├── CMakeLists.txt ├── Demo03 ├── Makefile ├── cmake_install.cmake ├── main.cc └── math ├── CMakeFiles ├── CMakeLists.txt ├── Makefile ├── MathFunction.cc ├── MathFunctions.h ├── cmake_install.cmake └── libMathFunctions.a 6 directories, 22 files
能够注意到生成了libMathFunctions.a
库
以glew
和glfw
为例
cmake_minimum_required(VERSION 3.9) project(helloworld) set(CMAKE_CXX_STANDARD 11) # 自动寻找库 find_library(OPENGL opengl) # 添加头文件 set(GLEW_H /usr/local/Cellar/glew/2.1.0/include/GL) set(GLFW_H /usr/local/Cellar/glfw/3.2.1/include/GLFW) include_directories(${GLEW_H} ${GLFW_H}) # 添加目标连接 set(GLEW_LINK /usr/local/Cellar/glew/2.1.0/lib/libGLEW.2.1.dylib) set(GLFW_LINK /usr/local/Cellar/glfw/3.2.1/lib/libglfw.3.dylib) link_libraries(${OPENGL} ${GLEW_LINK} ${GLFW_LINK}) # 执行编译命令 set(SOURCE_FILES main.cc) add_executable(helloworld ${SOURCE_FILES})
cmake做为跨平台的项目管理工具,相比make更加简洁易用。