CMake入门

CMake入门

CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake

一、单个文件

main.cc

#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 不区分大小写)

# 版本最低要求
cmake_minimum_required(VERSION 2.8)
# 项目信息
project(Demo01)
# 指定生成目标
add_executable(Demo01 main.cc)

执行命令

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也应当添加多个文件

# 版本最低要求
cmake_minimum_required(VERSION 2.8)
# 命令不区分大小写
# 项目信息
project(Demo02)

#把源文件变成变量
aux_source_directory(. DIR_SRCS)

# 指定生成目标
add_executable(Demo02 ${DIR_SRCS})

三、子模块

修改项目结构如下:

➜  cmakedemo tree
.
├── CMakeLists.txt
├── main.cc
└── math
    ├── CMakeLists.txt
    ├── MathFunction.cc
    └── MathFunctions.h

1 directory, 5 files

cmakedemo目录下的CMakeLists.txt

# 版本最低要求
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.txt

# 查找当前目录下的所有源文件
# 并将名称保存到 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

三、第三方库

glewglfw为例

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更加简洁易用。

posted @ 2018-07-16 11:14  潇雨危栏  阅读(398)  评论(0编辑  收藏  举报