【Toki從零學(xué)CMake】一磅叛、構(gòu)建簡(jiǎn)單的C語(yǔ)言庫(kù)

目錄

  1. 構(gòu)建簡(jiǎn)單的C語(yǔ)言庫(kù)
  2. 構(gòu)建可安裝的C語(yǔ)言庫(kù)
  3. 在vcpkg上發(fā)布源碼庫(kù)

參考文檔

CMake 官方文檔
CMake 入門實(shí)戰(zhàn)

運(yùn)行環(huán)境

2022年12月
MBP M1
macOS Big Sur 11.4
cmake 3.21.3

項(xiàng)目目錄

  • 本質(zhì)上構(gòu)建項(xiàng)目的代碼由CMakeList.txt來指定缤底,所以目錄怎么設(shè)計(jì)都可以茵汰,拍平都沒問題捐下,我分這么多目錄只是為了結(jié)構(gòu)清晰弧哎。
  • 把頭文件單獨(dú)放置在開發(fā)時(shí)會(huì)很不方便梧田,但封裝發(fā)布或者被引用的時(shí)候看起來會(huì)比較規(guī)范淳蔼。
.
├── CMakeLists.txt
├── demo
│   ├── CMakeLists.txt
│   └── demo.cpp
└── lib
    ├── CMakeLists.txt
    ├── include
    │   └── tkport
    │       └── tkport.hpp
    └── src
        └── tkport
            └── tkport.cpp

庫(kù)文件

  • 庫(kù)的源碼內(nèi)容可以自由發(fā)揮,我這里實(shí)現(xiàn)一個(gè)簡(jiǎn)單的打印函數(shù)裁眯,后續(xù)測(cè)試時(shí)會(huì)比較方便鹉梨。
// ./lib/include/tkport/tkport.hpp

#ifndef tkport_hpp
#define tkport_hpp

#include <iostream>

using namespace std;

class tkport {
private:
  string message;
public:
  tkport(string message);

  void show();
};

#endif /* tkport_hpp */
// ./lib/src/tkport/tkport.cpp

#include <tkport/tkport.hpp>

tkport::tkport(string message) {
  this->message = message;
}

void tkport::show() {
  cout << message << endl;
}
# ./lib/CMakeLists.txt

# 定義文件路徑的相關(guān)變量
set(PROJECT_BASE_INCLUDE ${CMAKE_CURRENT_LIST_DIR}/include)
file(GLOB_RECURSE PROJECT_BASE_INCLUDE_LIST include/**/*.hpp)
file(GLOB_RECURSE PROJECT_BASE_SRC_LIST src/**/*.cpp)

# 添加二進(jìn)制文件,聲明文件名及其源碼內(nèi)容
add_library(
  ${PROJECT_NAME} STATIC
  ${PROJECT_BASE_INCLUDE_LIST}
  ${PROJECT_BASE_SRC_LIST}
)

# 設(shè)置編譯選項(xiàng)
set_target_properties(
    ${PROJECT_NAME}
    PROPERTIES
    LINKER_LANGUAGE CXX
    CXX_STANDARD 17
)

# 添加頭文件引用
target_include_directories(
    ${PROJECT_NAME} PUBLIC
    $<BUILD_INTERFACE:${PROJECT_BASE_INCLUDE}>
)

示例文件

  • 示例內(nèi)容主要用來構(gòu)建可執(zhí)行文件穿稳,即一個(gè)測(cè)試庫(kù)文件的Demo存皂。
// ./demo/demo.c
#include <tkport/tkport.hpp>

int main() {
  tkport tkport = tkport("Hellp CMake!");
  tkport.show();
  return 1;
}
# ./demo/CMakeLists.txt

set(DEMO_NAME demo)

add_executable(${DEMO_NAME} demo.cpp)
target_link_libraries(${DEMO_NAME} ${PROJECT_NAME})

set_target_properties(
    ${DEMO_NAME}
    PROPERTIES 
    LINKER_LANGUAGE CXX
    CXX_STANDARD 17
)

根目錄文件

  • 用于整合聲明、構(gòu)建庫(kù)文件和示例文件
# ./CMakeLists.txt

# 本項(xiàng)目構(gòu)件所須的CMake最低版本號(hào)
cmake_minimum_required (VERSION 3.5)

# 配置項(xiàng)目信息
project(
  tkport # 項(xiàng)目名,會(huì)被保存到 PROJECT_NAME 變量
  VERSION 0.9.11 # 項(xiàng)目版本號(hào)(庫(kù)版本)
  LANGUAGES CXX # 項(xiàng)目開發(fā)語(yǔ)言
)

add_subdirectory(lib)

# 如果構(gòu)建時(shí)BUILD_DEMO參數(shù)為true旦袋,則構(gòu)建可執(zhí)行示例
if(BUILD_DEMO)
  add_subdirectory(demo)
endif()

構(gòu)建運(yùn)行

  1. 在根目錄創(chuàng)建 build 文件夾
  2. 執(zhí)行命令
$ cmake -B build -DBUILD_DEMO=true
$ cmake --build build
  1. 檢查構(gòu)建結(jié)果
  • 二進(jìn)制庫(kù)文件:./build/lib/libtkport.a
  • 可執(zhí)行示例文件: ./build/demo/demo
  1. 運(yùn)行主項(xiàng)目可執(zhí)行文件
$ build/demo
Hellp CMake!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末骤菠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子疤孕,更是在濱河造成了極大的恐慌商乎,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祭阀,死亡現(xiàn)場(chǎng)離奇詭異鹉戚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)专控,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門抹凳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伦腐,你說我怎么就攤上這事赢底。” “怎么了蔗牡?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵颖系,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我辩越,道長(zhǎng)嘁扼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任黔攒,我火速辦了婚禮趁啸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘督惰。我一直安慰自己不傅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布赏胚。 她就那樣靜靜地躺著访娶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪觉阅。 梳的紋絲不亂的頭發(fā)上崖疤,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音典勇,去河邊找鬼劫哼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛割笙,可吹牛的內(nèi)容都是我干的权烧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼般码!你這毒婦竟也來了妻率?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤侈询,失蹤者是張志新(化名)和其女友劉穎舌涨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扔字,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡囊嘉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了革为。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扭粱。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖震檩,靈堂內(nèi)的尸體忽然破棺而出琢蛤,到底是詐尸還是另有隱情,我是刑警寧澤抛虏,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布博其,位于F島的核電站,受9級(jí)特大地震影響迂猴,放射性物質(zhì)發(fā)生泄漏慕淡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一沸毁、第九天 我趴在偏房一處隱蔽的房頂上張望峰髓。 院中可真熱鬧,春花似錦息尺、人聲如沸携兵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)徐紧。三九已至,卻和暖如春炭懊,著一層夾襖步出監(jiān)牢的瞬間浪汪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工凛虽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人广恢。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓凯旋,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子至非,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容