zoukankan      html  css  js  c++  java
  • cmake简单介绍

    一、什么是cmake

    cmake 是为了让开发者编写一种与平台无关的CMakeList.txt文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。简单的说就是CMake会更加不同平台生成不同的Makefile,然后编译运行。开发者不需要对不同的平台做不同的开发限制。

    CMake 作为项目架构系统的知名开源项目有VTK、ITK、KDE、OpenCV、OSG 等 

    在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:

    1. 编写 CMake 配置文件 CMakeLists.txt 。
    2. 执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile 1 1ccmake 和 cmake 的区别在于前者提供了一个交互式的界面。。其中, PATH 是 CMakeLists.txt 所在的目录。
    3. 使用 make 命令进行编译。

    二、CMakeLists.txt编写

    单个源文件例子 main.cc

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

    CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的。符号 # 后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。

    对于上面的 CMakeLists.txt 文件,依次出现了几个命令:

    1. cmake_minimum_required:指定运行此配置文件所需的 CMake 的最低版本;
    2. project:参数值是 Demo1,该命令表示项目的名称是 Demo1 。
    3. add_executable: 将名为 main.cc 的源文件编译成一个名称为 Demo 的可执行文件。

    之后,在当前目录执行 cmake . ,得到 Makefile 后再使用 make 命令编译得到 Demo1 可执行文件。

    同个目录,多个源文件 main.cc MathFunctions.cc

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

    唯一的改动只是在 add_executable 命令中增加了一个 MathFunctions.cc 源文件。这样写当然没什么问题,但是如果源文件很多,把所有源文件的名字都加进去将是一件烦人的工作。更省事的方法是使用 aux_source_directory 命令,该命令会查找指定目录下的所有源文件,然后将结果存进指定变量名。其语法如下:

    aux_source_directory(<dir> <variable>)

    新CMakeLists.txt

    # CMake 最低版本号要求
    cmake_minimum_required (VERSION 2.8)
     
    # 项目信息
    project (Demo2)
     
    # 查找当前目录下的所有源文件
    # 并将名称保存到 DIR_SRCS 变量
    aux_source_directory(. DIR_SRCS)
     
    # 指定生成目标
    add_executable(Demo ${DIR_SRCS})

    多个目录,多个源文件

    项目结构

    ./Demo3
    |
    +--- main.cc
    |
    +--- math/
    |
    +--- MathFunctions.cc
    |
    +--- MathFunctions.h

    需要分别在项目根目录 Demo3 和 math 目录里各编写一个 CMakeLists.txt 文件。为了方便,我们可以先将 math 目录里的文件编译成静态库再由 main 函数调用。

    根目录中的 CMakeLists.txt :

    # CMake 最低版本号要求
    cmake_minimum_required (VERSION 2.8)
     
    # 项目信息
    project (Demo3)
     
    # 查找当前目录下的所有源文件
    # 并将名称保存到 DIR_SRCS 变量
    aux_source_directory(. DIR_SRCS)
     
    # 添加 math 子目录
    add_subdirectory(math)
     
    # 指定生成目标
    add_executable(Demo main.cc)
     
    # 添加链接库
    target_link_libraries(Demo MathFunctions)

    该文件添加了下面的内容: 第3行,使用命令 add_subdirectory 指明本项目包含一个子目录 math,这样 math 目录下的 CMakeLists.txt 文件和源代码也会被处理 。第6行,使用命令 target_link_libraries 指明可执行文件 main 需要连接一个名为 MathFunctions 的链接库 

    子目录中的 CMakeLists.txt:

    # 查找当前目录下的所有源文件
    # 并将名称保存到 DIR_LIB_SRCS 变量
    aux_source_directory(. DIR_LIB_SRCS)
     
    # 生成链接库
    add_library (MathFunctions ${DIR_LIB_SRCS})

    三、自定义编译选项

    # CMake 最低版本号要求
    cmake_minimum_required (VERSION 2.8)
     
    # 项目信息
    project (Demo4)
     
    # 加入一个配置头文件,用于处理 CMake 对源码的设置
    configure_file (
    "${PROJECT_SOURCE_DIR}/config.h.in"
    "${PROJECT_BINARY_DIR}/config.h"
    )
     
    # 是否使用自己的 MathFunctions 库
    option (USE_MYMATH
    "Use provided math implementation" ON)
     
    # 是否加入 MathFunctions 库
    if (USE_MYMATH)
    include_directories ("${PROJECT_SOURCE_DIR}/math")
    add_subdirectory (math)
    set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
    endif (USE_MYMATH)
     
    # 查找当前目录下的所有源文件
    # 并将名称保存到 DIR_SRCS 变量
    aux_source_directory(. DIR_SRCS)
     
    # 指定生成目标
    add_executable(Demo ${DIR_SRCS})
    target_link_libraries (Demo ${EXTRA_LIBS})

    其他内容详见下述链接

    本文内容摘自https://www.cnblogs.com/ningskyer/articles/7158948.html

  • 相关阅读:
    一维函数指针数组和二维函数指针数组demo
    等着新工作
    SSRS常见问题解决方案
    速度
    javascript 满足多层treeview的各种勾选
    vue create 初步解析以及定制化修改
    leveldb总结
    秋招总结场景设计题
    NOSQL: mongoDB windows
    更新webconfig配置文件
  • 原文地址:https://www.cnblogs.com/lgh344902118/p/13193083.html
Copyright © 2011-2022 走看看