zoukankan      html  css  js  c++  java
  • CMake 实践教程

    本篇博客是根据 <<CMake Practice>> 一文编写, 目的有三:

    其一: 提取出其中的精要部分;

    其二: 对其中不易理解的地方进行简要说明;

    其三: 方便后续查找复习.

    1. 第一个例子

    1.1 实验代码一

    新建一个目录 cmake_turtorial, cd到该目录,建立 main.cpp 和 CMakeLists.txt(注意文件名大小写).

    main.cpp 文件内容:

    // main.cpp
    #include <iostream>
    using namespace std;
    int main()
    {
      cout<<"Hello World from cmake_tutorial Main!"<<endl;
      return 0;
    }
    

     CMakeLists.txt文件内容:

    PROJECT (HELLO)
    SET(SRC_LIST main.cpp)
    MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
    MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
    ADD_EXECUTABLE(hello SRC_LIST)
    

     在该目录下执行终端命令:

    cmake .  (命令后面的点号,代表本目录)
    make
    

     执行终端命令

    ./hello 
    

    即可获得输出.

    1.2 代码解释

    CMakeLists.txt, 这个文件是 cmake 的构建定义文件, 文件名是大小写相关的, 如果工程存在多个目录,需要确保每个要管理的目录都存在一个CMakeLists.txt.

    PROJECT (HELLO)
    SET(SRC_LIST main.c)
    MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
    MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
    ADD_EXECUTABLE(hello ${SRC_LIST})
    

    PROJECT 指令的语法是:
    PROJECT(projectname [CXX] [C] [Java])
    你可以用这个指令定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,默认情况表示支持所有语言

    这个指令隐式的定义了两个 cmake 变量:
    <projectname>_BINARY_DIR 以及<projectname>_SOURCE_DIR,这里就是HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR(所以 CMakeLists.txt 中两个 MESSAGE
    指令可以直接使用了这两个变量). 这两个变量等价于 PROJECT_BINARY_DIRPROJECT_SOURCE_DIR变量 , 使用时直接使用后两者即可. 因为修改工程名称后,不需要同时修改这些变量。
    SET 指令的语法是:
    SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

    例如这样用:

    SET(SRC_LIST main.c t1.c t2.c)
    

    MESSAGE 指令的语法是:
    MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)
    这个指令用于向终端输出用户定义的信息,包含了三种类型:
    SEND_ERROR,产生错误,生成过程被跳过。
    SATUS ,输出前缀为 — 的信息。

    FATAL_ERROR,立即终止所有 cmake 过程.

    ADD_EXECUTABLE(hello ${SRC_LIST})
    定义了这个工程会生成一个文件名为 hello 的可执行文件,相关的源文件是 SRC_LIST 中定义的源文件列表.

    这个例子使用了${}来引用变量,这是 cmake 的变量应用方式,但是,有一些例外,比如在 IF 控制语句,变量是直接使用变量名引用,而不需要${}。

    如果使用了${}去应用变量,其实 IF 会去判断名为${}所代表的值的变量,那当然是不存在的了。

    指令是大小写无关的,参数和变量是大小写相关的。但,推荐你全部使用大写指令。

    如果源文件包含空格, 则可以写成如下这样:

    SET(SRC_LIST “fu nc.cpp”)   
    SET(SRC_LIST “fu nc.cpp” "main.cpp" "test.cpp")
    SET(SRC_LIST test.cpp; main.cpp; user.cpp)
    ADD_EXECUTABLE(t1 main.c t1.c)可以写成
    ADD_EXECUTABLE(t1 main.c; t1.c).
    

    对构建结果进行清理(清理掉生成的可执行文件)

    make clean
    

     在源文件所在目录进行构建成为内部构建, 在源文件之外的目录进行构建成为外部构建.

    下面演示外部构建:

    在tutorial文件夹下创建build文件夹,然后cd过去

    cmake ..    
    make
    

     ..代表父目录, 因为父目录存在我们需要的CMakeLists.txt,如果你在其他地方建立了 build 目录,需要运行 cmake <工程的全路径>),

       查看一下 build 目录,就会发现了生成了编译需要的 Makefile 以及其他的中间文件.

    2. 第二个例子

    为了让前面的 Hello World 更像一个工程,我们需要作的是:
    1,为工程添加一个子目录 src,用来放置工程源代码;
    2,添加一个子目录 doc,用来放置这个工程的文档 hello.txt
    3,在工程目录添加文本文件 COPYRIGHT, README;
    4,在工程目录添加一个 runhello.sh 脚本,用来调用 hello 二进制
    4,将构建后的目标文件放入构建目录的 bin 子目录;
    5,最终安装这些文件:将 hello 二进制与 runhello.sh 安装至/usr/bin,将 doc 目录的内容以及 COPYRIGHT/README 安装到/usr/share/doc/cmake/t2

    2.1 实验代码二

    在第一节我们提到了<projectname>_BINARY_DIR 和 PROJECT_BINARY_DIR 变量, 他们指的编译发生的当前目录,如果是内部编译,

    就相当于 PROJECT_SOURCE_DIR 也就是工程代码所在目录,如果是外部编译,指的是外部编译所在目录,也就是本例中的 build 目录。

    查看可执行程序的链接情况:

    ldd <可执行程序名>

     

  • 相关阅读:
    (转)轻松应对IDC机房带宽突然暴涨问题
    (转)老男孩:Linux企业运维人员最常用150个命令汇总
    (转)cut命令详解
    (转)Awk使用案例总结(运维必会)
    (转)Nmap命令的29个实用范例
    BigPipe学习研究
    js正则大扫除
    ffff表单提交的那点事
    高并发订单操作处理方法
    订单号的处理
  • 原文地址:https://www.cnblogs.com/lvchaoshun/p/6583095.html
Copyright © 2011-2022 走看看