成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

大型工程的管理,CMake快速入門

開發(fā) 開發(fā)工具
當我們的工程有成千上萬文件構成時,手動寫Makefile文件將是噩夢。幸好CMake幫我們解決了最為棘手的問題。今天我們就介紹一下自動生成Makefile文件的工具,CMake。

我們先從一個最簡單的場景開始,這種場景就是只有一個源文件的場景。當然,對于單文件的場景我們可以直接通過gcc進行編譯,但是為了說明CMake的用法,我們以此作為起點。后面我們會逐步介紹更加復雜的場景。目的很簡單,主要是為了降低入門的門檻,然后讓大家像上臺階一樣,不知不覺的爬到泰山之巔。

單文件的軟件工程

我們可以先創(chuàng)建一個目錄,比如simple,然后在這個目錄中創(chuàng)建一個名稱為main.cpp的C++程序,程序代碼如下所示。

#include <iostream>
int main(int argc, char** argv)
{
    std::cout << "this is a simple example!" << "\n";
    return 0;
}

再創(chuàng)建一個名稱為CMakeLists.txt的文件,這個文件正是cmake使用的文件。文件的內容如下,是不是很簡單。

cmake_minimum_required(VERSION 3.16)

project(CMakeSunny
      VERSION 1.0
      DESCRIPTION "A CMake Tutorial"
      LANGUAGES CXX)

add_executable(cmlearn
                           main.cpp)

上面文件中cmake_minimum_required用于指定cmake的最低版本號。project用于名稱功能,其中包含工程名稱、版本信息和工程描述等信息。最后add_executable則用于指定編程后的可執(zhí)行文件名稱以及源代碼文件。

具備上述兩個文件后,在根目錄下面創(chuàng)建一個名稱為build的目錄,然后切換到目錄下面,執(zhí)行cmake就可以生成一個Makefile文件。然后執(zhí)行make命令就可以編譯出二進制文件來。具體執(zhí)行的命令如下:

mkdir build
cd build
cmake ..
make

下圖展示了上述文件的關系,main.cpp和CMakeLists.txt是我們創(chuàng)建的。目錄build中的目錄和文件分別是通過cmake和make命令生成的。最終生成的二進制文件也是在build目錄中,名稱為cmlearn,這個名稱是在CMakeLists.txt定義的。

多文件的軟件工程

更進一步,如果我們的軟件工程通常包含不止一個文件,比如我們這里增加一個做加法的函數(shù),這個函數(shù)在一個獨立的文件中。此時工程中包含3個獨立的文件,分別為main.cpp、add.cpp和頭文件add.h。此時我們自己創(chuàng)建的文件目錄結構如下圖所示。

接下來我們只需要做很簡單的改動就可以將新文件的內容編譯進來。如下代碼所示,我們在add_executable中添加add.cpp文件即可。

cmake_minimum_required(VERSION 3.16)
project(CMakeSunny
    VERSION 1.0
    DESCRIPTION "A CMake Tutorial"
    LANGUAGES CXX)

add_executable(add
    main.cpp
    add.cpp)

上述add.cpp文件的內容如下所示,其功能很簡單,就是實現(xiàn)一個加法功能。

int add(int a, int b)
{
    return a+b;
}

頭文件的實現(xiàn)更加簡單,具體內容如下所示。需要注意的是,我們這里僅僅是為了延時CMake的功能,很多產(chǎn)品級必須的代碼名沒有寫到這里。

int add(int a, int b);

為了驗證實現(xiàn)的正確性,我們可以在main.cpp中做一些修改,引用在add.cpp中實現(xiàn)的函數(shù)。具體修改后的內容如下所示。

#include <iostream>
#include "add.h"

int main(int argc, char** argv)
{
    int r = add(1, 3);
    std::cout << "this is a simple example!" << r << "\n";
    return 0;
}

完成上述修改后,大家可以切回到build目錄中,重新執(zhí)行cmake ..和make命令,可以看到生成了新的二進制文件cmlearn。我們可以執(zhí)行一下這個程序,可以看到結果符合預期。

包含子目錄的軟件工程

實際的大型項目比上面介紹的還要復雜的多。比如上文我們提到實現(xiàn)了一個加法功能的add.cpp文件。比如我們又要實現(xiàn)減法、乘法和除法等功能,也都是在獨立的文件中實現(xiàn)。那么這些計算的實現(xiàn)最好放到一個目錄中,比如math目錄。在大型項目中經(jīng)常會這樣組織源代碼,一個功能模塊的代碼,或者詳細功能的代碼被組織在一個子目錄中。

這是源代碼會被組織成如下圖所示的結構,而且在子目錄math中也需要新建一個名稱為CMakeLists.txt文件。該文件的內容可以非常簡單,具體如下所示,是不是很簡單!

add_library(math OBJECT sub.cpp
                                          add.cpp)

函數(shù)add_library用于創(chuàng)建一個庫,這里的庫與Linux的動態(tài)庫和靜態(tài)庫的概念基本對應,但不完全一樣。本例是創(chuàng)建一個OBJECT類型的庫,其實就是生成目標文件。如前文所述,這個函數(shù)可以創(chuàng)建Linux的動態(tài)庫和靜態(tài)庫,我們后面會詳細介紹一下這方面的內容。

如下是該函數(shù)的幾種應用場景,比如STATIC是靜態(tài)庫,SHARED是動態(tài)庫,OBJECT則是我們當前使用的目標文件。另外還有MODULE、INTERFACE和IMPORTED等類型。

add_library(<name> [STATIC | SHARED | MODULE]
    [EXCLUDE_FROM_ALL]
    [<source>...])
add_library(<name> OBJECT [<source>...])
add_library(<name> INTERFACE)
add_library(<name> <type> IMPORTED [GLOBAL])

有了子目錄中的CMakeLists.txt還不夠,我們需要在根目錄的CMakeLists.txt添加一些內容,建立根目錄與子目錄math的聯(lián)系。建立聯(lián)系很簡單,我們只需要在根目錄的CMakeLists.txt中添加如下一行代碼即可。

add_subdirectory(math)

當添加上述代碼后,我們在build目錄再次執(zhí)行cmake命令的時候可以觸發(fā)子目錄生成Makefile文件。而執(zhí)行make命令進行編譯的時候,可以觸發(fā)子目錄的編譯,生成目標文件。

target_link_libraries(cmlearn PUBLIC math)

上述函數(shù)實現(xiàn)了鏈接的功能,將子模塊math鏈接到了主模塊main上,最終會生成一個可執(zhí)行程序。但是我們在源代碼層面還沒有任何更該,主程序也沒有調用add.cpp和sub.cpp中的任何函數(shù),所以實際上也不存在鏈接的過程。

如果讓主程序調用math中的函數(shù),首先需要在主程序中包含頭文件。在CMakeLists.txt中需要添加如下代碼來告訴編譯器頭文件的位置。否則在編譯的時候會有找不到頭文件的錯誤提示。

target_include_directories(cmlearn PUBLIC
    "${PROJECT_SOURCE_DIR}/math"
)

完成CMakeLists.txt的修改后,我們最后需要修改一下主程序。修改主程序的目的主要是讓主程序調用math中實現(xiàn)的函數(shù)。修改后的主程序如下所示,在主程序中調用了add和sub兩個函數(shù),并且在一開始包含了add.h和sub.h兩個文件。

#include <iostream>
#include "add.h"
#include "sub.h"

int main(int argc, char** argv)
{
    int sum = add(1, 3);
    int diff = sub(3, 1);
    std::cout << "The sum of 1 and 3 is " << sum << std::endl;
    std::cout << "The diff of 3 and 1 is " << diff << std::endl;
    return 0;
}

完成上述修改后,我們可以在build目錄執(zhí)行“cmake ..”命令,然后執(zhí)行make命令編譯程序,最后可以得到一個可執(zhí)行程序。

通過上面的舉例,我們對通過CMake來維護一個大型的軟件項目有了一個初步的了解。實際上CMake實現(xiàn)的功能還要豐富的多, 我們在后續(xù)會詳細介紹。

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-10-08 08:28:10

Spring事務管理

2020-07-21 08:20:23

系統(tǒng)架構編輯器

2015-10-29 15:36:19

Redis入門

2017-06-14 17:50:44

Kotlin寫法Java

2021-03-19 12:26:00

物聯(lián)網(wǎng)IoT大數(shù)據(jù)

2011-11-29 12:27:54

2009-09-24 15:27:41

Hibernate查詢

2010-06-24 13:35:53

GRE協(xié)議

2011-03-08 16:50:35

2021-05-07 08:02:53

Sentinel 流量服務

2025-05-07 00:10:00

2023-12-19 09:36:35

PostgreSQL數(shù)據(jù)庫開源

2009-11-18 14:53:59

PHP Session

2011-05-16 09:15:22

SQL語言

2011-05-16 09:22:28

SQL語言

2025-02-28 08:42:53

SpringNetflixHystrix

2021-01-15 09:30:02

Tomcat ApacheJavaServer

2020-11-25 19:05:50

云計算SaaS公有云

2019-11-13 15:44:17

Kafka架構數(shù)據(jù)

2011-06-28 17:52:49

SEO
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品色视频 | 亚洲香蕉在线视频 | 美女二区 | 范冰冰一级做a爰片久久毛片 | 日韩精品一区二区三区在线观看 | 国产在视频一区二区三区吞精 | 夜夜爽99久久国产综合精品女不卡 | 中文字幕1区| 精品毛片在线观看 | 日本a v在线播放 | 亚洲综合精品 | 亚洲视频国产 | 亚洲福利一区 | 亚洲高清电影 | 精品久久久久久久 | 在线观看av网站 | 久久中文字幕一区 | 国偷自产av一区二区三区 | 日韩欧美三区 | 日韩欧美一区二区三区免费观看 | 天天搞夜夜操 | 久久精品亚洲 | 中文字幕亚洲视频 | 男女黄网站 | 一区二区三区国产精品 | 亚洲精品9999 | 欧美极品在线观看 | 欧美精品一区二区在线观看 | 天堂亚洲网 | 日韩高清成人 | 一区二区欧美在线 | 91麻豆精品一区二区三区 | 精品一区av | 欧美精品一区二区三区在线播放 | 久久久久久国产精品三区 | 天天操天天插天天干 | 日韩在线免费视频 | 97国产爽爽爽久久久 | 欧美国产精品一区二区三区 | 久久精品久久久久久 | 国产一区在线看 |