0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CMake的實戰(zhàn)教程-2

汽車電子技術(shù) ? 來源:物聯(lián)網(wǎng)IoT開發(fā) ? 作者: 杰杰mcu ? 2023-02-14 10:43 ? 次閱讀

前言

從上一篇的文章中,相信大家也了解了CMake這個東西,但是呢它不是只是看一下就能會的,這種東西還是要實踐才能學會,那么如果你已經(jīng)實踐過了,就會體會到上一篇文章在實際中使用到底是多么的難搞,比如:

  • 生成很多垃圾文件,這是我的第一個體會….
  • 需要手動去指定編譯的文件
  • 無法指定編譯器,編譯選項等等很多東西….
  • 如果有子目錄也不能完全適用….
  • 以及一些其他的問題….

總的來說就是在真正項目中壓根就沒法適用的工程,那為什么我要寫呢,因為那是我學習的過程,總不能一口吞下一個大胖子是不是,接下來的一系列文章我就會讓CMake變得能在實際中使用,越來越自動化,更方便構(gòu)建。。。

外部構(gòu)建

第一個問題,在運行cmake .后會產(chǎn)生很多垃圾文件,那么我們可以讓它在一個build目錄下去編譯,生成的垃圾文件放在這個目錄下就好了,不需要的時候直接清除即可。

可能有人會問,它不能像Makefile一樣直接make clean 或者make distclean清除編譯的垃圾文件嗎,我當時學的時候也谷歌過,但是,很遺憾沒有,使用我才讓它產(chǎn)生的垃圾文件放在build目錄下,其實不能說是垃圾文件,只不過是一些中間文件,記錄某些東西的,我用不上它,所以認為是垃圾…僅此而已。

對此官方的解釋是:

CMakeLists.txt 可以執(zhí)行腳本并通過腳本生成一些臨時文件,但是卻沒有辦法來跟蹤這些臨時文件到底是哪些,因此,沒有辦法提供一個可靠的 clean 方案。

那怎么辦呢?很簡單,從CMake的語法我們就知道,它在構(gòu)建的時候指定了PATH,也就是頂層CMakeLists.txt 入口的路徑。

cmake PATH

那么很顯然,它可以是相對路徑而不是絕對路徑,畢竟‘.’ 表示當前路徑, 點點‘..’ 表示上一級路徑,那么我們可以新建一個build目錄,然后在build目錄下去運行:

cmake ..

這在CMake中稱之為外部構(gòu)建(out-of-source build),而 CMake 強烈推薦的就是外部構(gòu)建!

我自己也寫了個build的腳本,內(nèi)容非常簡單,主要做兩件事:

  1. 創(chuàng)建一個build目錄(存在就不會重新創(chuàng)建的)
  2. 進入build目錄
  3. 然后外部構(gòu)建cmake
  4. 生成Makefile文件后運行make命令編譯
#!/bin/bash

mkdir -p build
cd build
cmake ..
make

因此在編譯的時候直接運行這個腳本即可,生成的內(nèi)容全部都在build目錄下。

  • 這是原始目錄
.
├── build.sh
├── CMakeLists.txt
└── main.c

0 directories, 3 files

編譯后在build目錄下生成很多文件,包括 Makefile、section2(可執(zhí)行程序)

CMakeCache.txt  CMakeFiles  cmake_install.cmake  Makefile  section2

補充一點,如果你想看到cmake生成的垃圾文件比你源碼還多的時候,你就會愛死外部構(gòu)建這種騷操作了~

自動查找源碼

不得不說,cmake是個很好的自動化構(gòu)建工具,既然是自動化,那么很的東西都是自動的,比如查找源碼,cmake就提供查找源碼的命令:

aux_source_directory(<dir> <variable>)

它的主要作用就是: 查找在某個路徑下的所有源文件 ,注意,是所有源碼文件,當你的目錄下有很多個源碼文件的時候,他就主動去查找了,哦,當然,它也只會查找源碼文件,比如*.c 、 *.cpp 、*.cc啦,反正只要是源碼就可以了,但是什么txt 、 *.h文件這些它是不會記錄下來的。

  • dir :指定的目錄(可以是絕對路徑也可以是相對路徑)
  • variable:將輸出結(jié)果列表儲存在指定的變量中。

反正這個命令就很方便,我在某個目錄下有啥源碼文件,我都會被記錄到變量,然后在CMake直接使用即可。當然后續(xù)也有其他的命令去找源碼文件,一口吃不了一個大胖子,先了解這個先,后續(xù)慢慢學習~

變量

CMake中,變量是十分常見的,我正在就簡單講解下基本的語法吧:

定義變量常用的函數(shù)是:

set(VARIABLE_NAME VARIABLE)

取消定義變量是

unset(VARIABLE_NAME )
  • VARIABLE_NAME :變量名字
  • VARIABLE:變量的值

變量的的值始終是string(字符串)類型,變量名字是區(qū)分大小寫的,一般變量命名還是正常點比較好,別搞太多亂七八糟的特殊符號,只要數(shù)字、字母,下劃線"_" 、橫線"-"就差不多了,變量的作用域也是有全局與局部之分,與C語言、Java都差不多,我也不多說了。我的例程中全局變量是全部大寫,局部變量是全小寫的,也是比較好區(qū)分。

變量引用的形式為${variable_name},變量引用被變量的值替換,或者如果變量沒有被設(shè)置,則由空字符串替換。變量引用可以嵌套,例如${outer_${inner_variable}veriable};環(huán)境變量引用的形式為$ENV{VARIABLE},并在相同的上下文中作為正常變量引用。

打印日志

在CMake構(gòu)建的時候,你可能不知道某些變量是啥內(nèi)容,那么就在終端打印出來看看就好了,這根我們寫代碼中的printf函數(shù)差不多,給直接打一串字符串出來瞧瞧….

message([] "message to display" ...)

首先呢,是指定消息的類型:

  • (無) = 重要消息;
  • STATUS = 非重要消息;
  • WARNING = CMake 警告, 會繼續(xù)執(zhí)行;
  • AUTHOR_WARNING = CMake 警告 (dev), 會繼續(xù)執(zhí)行;
  • SEND_ERROR = CMake 錯誤, 繼續(xù)執(zhí)行,但是會跳過生成的步驟;
  • FATAL_ERROR = CMake 錯誤, 終止所有處理過程;

正常情況下我都是輸出一些狀態(tài)信息——STATUS,打印個變量啦,打印下代碼的執(zhí)行順序啦等等….

后面就是有些字符串信息了,變量在這里直接引用就好,畢竟變量本身就是字符串….

section3

給出個實例代碼:

當前目錄存在2個c文件,分別是main.cpower.c就是簡單計算x的y次方,純粹是個demo,我自己也懶得寫,并不是因為代碼有多高深,所以這代碼我是從網(wǎng)上找的,來自@潘偉洲大神的cmake測試代碼:https://github.com/wzpan/cmake-demo。

  • main.c
#include 
#include 
#include "power.h"

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;
}
  • power.c
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;
}

然后就是CMakeLists.txt文件:

# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)

# 項目信息
project (section3)

# 查找當前目錄下的所有源文件
# 并將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)

# 指定生成目標
add_executable(section3 ${DIR_SRCS})

相比于上一篇文章,我這個CMakeLists.txt文件只是添加了aux_source_directory命令去自動掃描當前目錄下的源碼文件,并且保存到DIR_SRCS 變量中,僅此而已??!

然后在add_executable命令中,用${DIR_SRCS}變量代替指定的源碼文件source1 source2 ... sourceN,當然你也可以打印一下${DIR_SRCS}變量到底保存了什么,如果不出意外的話,它保存的就是./main.c; ./power.c,表示的是當前目錄下的main.c、power.c這兩個文件,而分號代表它是一個list,后續(xù)會講解怎么去提取list的內(nèi)容….

message(STATUS "${DIR_SRCS}")

然后用外部構(gòu)建的方式去編譯代碼:

jie@pc:~/github/cmake/section3$ ./build.sh 
-- The C compiler identification is GNU 7.4.0
-- The CXX compiler identification is GNU 7.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /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: /usr/bin/c++
-- Check for working CXX compiler: /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: /home/jie/github/cmake/section3/build
Scanning dependencies of target section3
[ 33%] Building C object CMakeFiles/section3.dir/main.c.o
[ 66%] Building C object CMakeFiles/section3.dir/power.c.o
[100%] Linking C executable section3
[100%] Built target section3

很明顯生成了正確可執(zhí)行文件~

代碼下載

https://github.com/jiejieTop/cmake

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 文件
    +關(guān)注

    關(guān)注

    1

    文章

    558

    瀏覽量

    24645
  • Build
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    12027
  • CMake
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    1255
收藏 人收藏

    評論

    相關(guān)推薦

    cmake是什么?cmake的特性和編譯原理(cmake原理和cmake編譯過程)

    CMake是一個開源、跨平臺的工具系列,是用來構(gòu)建、測試和打包軟件。
    的頭像 發(fā)表于 07-18 10:53 ?4151次閱讀
    <b class='flag-5'>cmake</b>是什么?<b class='flag-5'>cmake</b>的特性和編譯原理(<b class='flag-5'>cmake</b>原理和<b class='flag-5'>cmake</b>編譯過程)

    Windows下編譯工具CMake的安裝和最簡使用

    MCU的開發(fā)環(huán)境一般在Windows操作系統(tǒng)上,簡單的工程一般直接編寫Makefile文件后使用make工具構(gòu)建程序,復雜的工程一般借助CMake來生成Makefile文件后使用make工程構(gòu)建程序
    的頭像 發(fā)表于 11-14 10:18 ?6843次閱讀
    Windows下編譯工具<b class='flag-5'>CMake</b>的安裝和最簡使用

    CMake 入門實戰(zhàn)

    CMake 入門實戰(zhàn),,
    發(fā)表于 09-28 12:38

    交叉平臺開源編譯系統(tǒng)_cmake入門

    交叉平臺開源編譯系統(tǒng)_cmake入門
    發(fā)表于 01-22 13:59 ?9次下載

    Cmake學習的總結(jié)(二)

    大家好,上次給大家分享了第一篇 cmake 文章:cmake學習總結(jié)(一),今天繼續(xù)給大家分享cmake。那么廢話就不多說,開始內(nèi)容分享。
    的頭像 發(fā)表于 12-24 17:54 ?599次閱讀

    cmake管理配置ROOT項目的方法

    配置文件組成。 ? 序號 文件名 文件說明 1 CMakeLists.txt? Cmake配置文件,用于組織項目的編譯需要的庫、編譯的過程、編譯結(jié)果 2 CMakeLists.txt.user
    的頭像 發(fā)表于 01-18 17:45 ?4481次閱讀
    <b class='flag-5'>cmake</b>管理配置ROOT項目的方法

    如何使用CMake工具套件構(gòu)建CUDA應用程序

    我希望這篇文章向您展示了 CMake 如何自然地支持構(gòu)建 CUDA 應用程序。如果您是 CMake 的現(xiàn)有用戶,請試用 CMake 3 . 9 并利用改進的 CUDA 支持。如果您不是 CMa
    的頭像 發(fā)表于 04-01 17:42 ?4364次閱讀
    如何使用<b class='flag-5'>CMake</b>工具套件構(gòu)建CUDA應用程序

    RT-Thread V4.1.0新特性CMake介紹與構(gòu)建CMake工程

    ? ? CMake 支持 在 RT-Thread 4.1.0 正式發(fā)布版中,添加了對 CMake 的支持。開發(fā)者可以使用 SCons 工具來生成 CMakeLists.txt 文件。 為何要支持
    的頭像 發(fā)表于 05-24 19:20 ?2900次閱讀

    RT-Thread 4.1.0的CMake構(gòu)建教程

    CMake 支持 在 RT-Thread 4.1.0 正式發(fā)布版中,添加了對 CMake 的支持。開發(fā)者可以使用 SCons 工具來生成 CMakeLists.txt 文件。 為何要支持 CMake
    的頭像 發(fā)表于 05-25 11:06 ?3245次閱讀

    CMake用法詳解

    CMake用法詳解
    發(fā)表于 10-25 16:28 ?2次下載

    CMake實戰(zhàn)教程-1

    CMake 是一個跨平臺的構(gòu)建系統(tǒng)生成工具。它使用平臺無關(guān)的 CMake 清單文件CMakeLists.txt,指定工程的構(gòu)建過程;源碼樹的每個路徑下都有這個文件。CMake 產(chǎn)生一個適用于具體平臺的構(gòu)建系統(tǒng),用戶使用這個系統(tǒng)構(gòu)
    的頭像 發(fā)表于 02-14 10:42 ?673次閱讀
    <b class='flag-5'>CMake</b>的<b class='flag-5'>實戰(zhàn)</b>教程-1

    CMake實戰(zhàn)教程-2

    第一個問題,在運行`cmake .`后會產(chǎn)生很多垃圾文件,那么我們可以讓它在一個build目錄下去編譯,生成的垃圾文件放在這個目錄下就好了,不需要的時候直接清除即可。
    的頭像 發(fā)表于 02-28 16:18 ?668次閱讀

    在Linux下如何使用CMake編譯程序

    CMake是開源、跨平臺的構(gòu)建工具,可以讓我們通過編寫簡單的配置文件去生成本地的Makefile,這個配置文件是獨立于運行平臺和編譯器的,這樣就不用親自去編寫Makefile了,而且配置文件可以直接
    的頭像 發(fā)表于 11-08 16:15 ?5688次閱讀
    在Linux下如何使用<b class='flag-5'>CMake</b>編譯程序

    CMake構(gòu)建后的項目結(jié)構(gòu)解析

    一、 CMake構(gòu)建后的項目結(jié)構(gòu)解析(Analysis of the Project Structure After CMake Build) 1.1 CMake構(gòu)建后的目錄結(jié)構(gòu)(Directory
    的頭像 發(fā)表于 11-10 10:27 ?1727次閱讀
    <b class='flag-5'>CMake</b>構(gòu)建后的項目結(jié)構(gòu)解析

    請問一下CMake和Make之間的區(qū)別有哪些?

    CMake和Make是構(gòu)建軟件,其工作涉及將源代碼轉(zhuǎn)換為可執(zhí)行程序。CMake和Make是旨在實現(xiàn)構(gòu)建過程自動化的工具,幫助開發(fā)者節(jié)省時間和精力。
    的頭像 發(fā)表于 02-27 11:44 ?1628次閱讀