• 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 
    ", argv[0]);
            return 1;
        }
        double base = atof(argv[1]);
        int exponent = atoi(argv[2]);
        double result = power(base, exponent);
        printf("%g ^ %d is %g
    ", 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更加简洁易用。

  • 相关阅读:
    CentOS 6.5 源码安装subversion-1.8.8,附加mod_dav_svn模块
    MySQL建表设置外键提示错误
    Servlet3.0提供的异步处理
    Servlet3.0使用@WebServlet注解配置问题记录
    我的博客开通啦!
    关于Wii的蓝牙接收
    关于Wii的软件制作
    提升学习算法简述:AdaBoost, GBDT和XGBoost
    决策树中的熵和基尼指数
    机器学习排序算法:RankNet to LambdaRank to LambdaMART
  • 原文地址:https://www.cnblogs.com/fanghao/p/9316713.html
Copyright © 2020-2023  润新知