zoukankan      html  css  js  c++  java
  • 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更加简洁易用。

  • 相关阅读:
    Chapter 03Using SingleRow Functions to Customize Output(03)
    Chapter 03Using SingleRow Functions to Customize Output(01)
    Chapter 04Using Conversion Functions and Conditional ExpressionsNesting Functions
    Chapter 04Using Conversion Functions and Conditional ExpressionsGeneral Functions
    Chapter 11Creating Other Schema Objects Index
    传奇程序员John Carmack 访谈实录 (zz.is2120)
    保持简单纪念丹尼斯里奇(Dennis Ritchie) (zz.is2120.BG57IV3)
    王江民:传奇一生 (zz.is2120)
    2011台湾游日月潭
    2011台湾游星云大师的佛光寺
  • 原文地址:https://www.cnblogs.com/fanghao/p/9316713.html
Copyright © 2011-2022 走看看