CMakeList語法知識(shí)

在寫這篇文章之前開始是想一些shell腳本與Makefile的一些基礎(chǔ)語法知識(shí)猎拨。但是又覺得太過基礎(chǔ)炼蛤。關(guān)于Liunx shell腳本可以看看教程http://c.biancheng.net/linux_tutorial/ CMake是一種跨平臺(tái)編譯工具戏罢,CMake主要是編寫CMakeLists.txt文件乍狐,然后通過cmake命令將CMakeLists.txt文件轉(zhuǎn)化為make所需要的Makefile文件肚逸,最后用make命令編譯源碼生成可執(zhí)行程序或者庫文件认境。實(shí)際項(xiàng)目中的C/C++文件不計(jì)其數(shù)、文件放置的位置也不同课竣,Makefile定義了一系列的規(guī)則來指定嘉赎,哪些文件需要先編譯置媳,哪些文件需要后編譯,哪些文件需要重新編譯公条,甚至于進(jìn)行更復(fù)雜的功能操作拇囊。實(shí)現(xiàn)自動(dòng)化的編譯。

CMake方式編譯生成庫文件

以簡單的例子來來看看CMake的語法,創(chuàng)建一個(gè) test項(xiàng)目靶橱,項(xiàng)目結(jié)構(gòu)如下
├── test目錄
│ ├── CMakeLists.txt
│ ├── include目錄
│ │ ├── myprint.h
│ ├── src 目錄
│ │ ├── myprint.cpp
│ ├── lib目錄
│ ├── biuld目錄


示例項(xiàng)目目錄結(jié)構(gòu).png

include目錄放置頭文件寥袭,src目錄下放置的是.c/.cpp源文件,biuld目錄是用來構(gòu)建的項(xiàng)目关霸,lib目錄用來放置我們生成庫文件传黄。
include目錄下的myprint.h頭文件

#include<stdio.h>
#include<stdlib.h>

void myprint(char* str);

src目錄下myprint.cpp文件

#include "/usr/demo/test5/include/myprint.h"

void myprint(char* str) {

        printf("%s",str);

}

怎樣利用CMake來將項(xiàng)目編譯成動(dòng)態(tài)庫提供給其他項(xiàng)目使用。首先我們要?jiǎng)?chuàng)建CMakeLists.txt文件队寇,簡單的來說CMake就是我們把編譯信息錄入膘掰,cmake命令根據(jù)CMakeLists.txt生成編譯需要的Makefile文件〖亚玻看看CMakeLists.txt具體的編寫

#指定CMake編譯最低要求版本
CMAKE_MINIMUM_REQUIRED(VERSION 3.14)
#給項(xiàng)目命名
PROJECT(MYPRINT)
#收集c/c++文件并賦值給變量SRC_LIST_CPP  ${PROJECT_SOURCE_DIR}代表區(qū)當(dāng)前項(xiàng)目錄
FILE(GLOB SRC_LIST_CPP ${PROJECT_SOURCE_DIR}/src/*.cpp)
FILE(GLOB SRC_LIST_C ${PROJECT_SOURCE_DIR}/src/*.c)
#指定頭文件目錄
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
#指定生成庫文件的目錄
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
#去變量SRC_LIST_CPP 與SRC_LIST_C 指定生成libmyprint 動(dòng)態(tài)庫   默認(rèn)生成靜態(tài)庫  SHARED指定生成庫類型為動(dòng)態(tài)庫
ADD_LIBRARY(myprint SHARED ${SRC_LIST_CPP} ${SRC_LIST_C})

編寫好CMakeLists.txt文件 cd到項(xiàng)目biuld目錄執(zhí)行cmake命令 將會(huì)在biuld目錄下生成Makefile文件识埋,執(zhí)行make命令項(xiàng)目就會(huì)開始編譯,在項(xiàng)目lib目錄下生成libmyprint.so文件零渐,是不是非常簡單窒舟,相比編寫Makefile文件來說。生成的動(dòng)態(tài)庫文件那么我們?cè)趺慈ユ溄邮褂盟厮信危坷^續(xù)往下看

CMake鏈接使用庫文件

這里就不新建項(xiàng)目啦惠豺,直接在src目錄下新建源文件建hello.cpp 來應(yīng)用libmyprint.so庫。

#include <stdio.h>
#include "/usr/demo/test5/include/myprint.h"

int main() {
        myprint("hello World\n");
        return 0;
}

那么我們就要重新寫個(gè)CMakeLists.txt文件拦耐,內(nèi)容如下

CMAKE_MINIMUM_REQUIRED(VERSION 3.14)
#指定項(xiàng)目名稱
PROJECT(HELLO)

#將hello.cpp 賦值給SOURCE 變量
SET(SOURCE ${PROJECT_SOURCE_DIR}/src/hello.cpp)

#指定頭文件目錄
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
#指定鏈接庫文件目錄
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib)

#將hello.cpp生成可執(zhí)行文件hello 
ADD_EXECUTABLE(hello ${SOURCE})

#指定hello 鏈接庫myprint
TARGET_LINK_LIBRARIES(hello myprint)

cd到項(xiàng)目biuld目錄執(zhí)行cmake命令 將會(huì)在biuld目錄下生成Makefile文件耕腾,執(zhí)行make命令见剩,編譯完后杀糯,將在biuld目錄下生成可執(zhí)行文件hello。執(zhí)行hello
helloworld.png

Android程序員學(xué)習(xí)CMake最終還是要為我們Android項(xiàng)目服務(wù)苍苞,Android studio 2.2 之后開始采用 CMake 的這種方式來構(gòu)建NDK項(xiàng)目固翰。包括一些優(yōu)秀的開源庫也有采用CMake的方式來編譯。具體看看CMake在Android中的使用羹呵。

Android中的CMakeLists.txt

由于后面會(huì)寫一些關(guān)于NDK音視頻的知識(shí),就以引入FFmpeg音視頻庫來看看Android 中CMakeLists.txt是怎么編寫的骂际。

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.
cmake_minimum_required(VERSION 3.4.1)
# 需要引入我們頭文件,以這個(gè)配置的目錄為基準(zhǔn)
include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/include)
#添加共享庫搜索路徑
link_directories(${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi)
# 指定源文件目錄
AUX_SOURCE_DIRECTORY(${CMAKE_SOURCE_DIR}/src/main/cpp SRC_LIST)

add_library(
        # Sets the name of the library.
        native-lib
        # Sets the library as a shared library.
        SHARED
        # Provides a relative path to your source file(s).
#        src/main/cpp/native-lib.cpp
        ${SRC_LIST}
        )

find_library( # Sets the name of the path variable.
        log-lib
        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log )

target_link_libraries( # Specifies the target library.

        native-lib
        avcodec-57
        avdevice-57
        avfilter-6
        avformat-57
        avutil-55
        swresample-2
        swscale-4
        postproc-54

        # Links the target library to the log library
        # included in the NDK.
        ${log-lib} )
總結(jié)

了解了CMake語法,以及它正真的意義冈欢。以后遇上Android NDK項(xiàng)目便可以自己編寫CMakeLists.txt文件內(nèi)容歉铝。要想更深的深入可以去學(xué)習(xí)一下CMake文檔。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凑耻,一起剝皮案震驚了整個(gè)濱河市太示,隨后出現(xiàn)的幾起案子柠贤,更是在濱河造成了極大的恐慌,老刑警劉巖类缤,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臼勉,死亡現(xiàn)場離奇詭異,居然都是意外死亡餐弱,警方通過查閱死者的電腦和手機(jī)宴霸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膏蚓,“玉大人瓢谢,你說我怎么就攤上這事〗翟剩” “怎么了恩闻?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長剧董。 經(jīng)常有香客問我幢尚,道長,這世上最難降的妖魔是什么翅楼? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任尉剩,我火速辦了婚禮,結(jié)果婚禮上毅臊,老公的妹妹穿的比我還像新娘理茎。我一直安慰自己,他們只是感情好管嬉,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布皂林。 她就那樣靜靜地躺著,像睡著了一般蚯撩。 火紅的嫁衣襯著肌膚如雪础倍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天胎挎,我揣著相機(jī)與錄音沟启,去河邊找鬼。 笑死犹菇,一個(gè)胖子當(dāng)著我的面吹牛德迹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播揭芍,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼胳搞,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肌毅,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤币厕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后芽腾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旦装,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年摊滔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阴绢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡艰躺,死狀恐怖呻袭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腺兴,我是刑警寧澤左电,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站页响,受9級(jí)特大地震影響篓足,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜闰蚕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一栈拖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧没陡,春花似錦涩哟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至埃儿,卻和暖如春器仗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝌箍。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國打工青灼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留暴心,地道東北人妓盲。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像专普,于是被迫代替她去往敵國和親悯衬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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

  • 注:首發(fā)地址 1. 前言 當(dāng)在做 Android NDK 開發(fā)時(shí),如果不熟悉用 CMake 來構(gòu)建筋粗,讀不懂 CMa...
    cfanr閱讀 24,424評(píng)論 1 53
  • CMake學(xué)習(xí) 本篇分享一下有關(guān)CMake的一些學(xué)習(xí)心得以及相關(guān)使用策橘。 本文目錄如下: [1、CMake介紹] [...
    AlphaGL閱讀 12,252評(píng)論 11 79
  • 參考 CMake入門實(shí)戰(zhàn)cmake緩存清理 什么是CMake CMake允許開發(fā)者編寫一種平臺(tái)無關(guān)的CMakeLi...
    GeminiGirl0604閱讀 3,409評(píng)論 0 3
  • 搬運(yùn)自本人 CSDN 博客:https://blog.csdn.net/ajianyingxiaoqinghan/...
    琦小蝦閱讀 15,393評(píng)論 0 11
  • 1.安裝 $sudo apt-get install cmake 2.示例:簡單的文件目錄 sample |—...
    荷包蛋醬閱讀 29,656評(píng)論 0 15