CMake基本配置與注意事項(xiàng)

CMake

CMake是一個(gè)跨平臺(tái)的構(gòu)建工具寡壮,它是一個(gè)比make更高級(jí)的編譯配置工具贩疙,它可以根據(jù)不同平臺(tái)讹弯、不同的編譯器,生成相應(yīng)的Makefile或者vcproj項(xiàng)目这溅,從而達(dá)到跨平臺(tái)的目的组民。
Android Studio利用CMake生成的是ninja 。
CMake的腳本名默認(rèn)是CMakeLists.txt 悲靴。

#cmake最低版本
cmake_minimum_required(VERSION 3.6.0)

#指定項(xiàng)目
project(Main)

#生成可執(zhí)行文件 main
add_executable(main main.c)

#執(zhí)行cmake . 生成makefile
#再執(zhí)行make即可生成main程序

如果源文件很多臭胜,那么一個(gè)個(gè)寫(xiě)進(jìn)去是一件很麻煩的事情,這時(shí)候可以:

cmake_minimum_required(VERSION 3.6.0)
project(Main)
#查找當(dāng)前目錄所有源文件 并將名稱(chēng)保存到 DIR_SRCS 變量
#不能查找子目錄
aux_source_directory(. DIR_SRCS)
//message:打印
message(${DIR_SRCS})

#也可以 
file(GLOB DIR_SRCS *.c)
add_executable(main ${DIR_SRCS})

如果在cmake中需要使用其他目錄的cmakelist:

cmake_minimum_required (VERSION 3.6.0)
project (Main)
aux_source_directory(. DIR_SRCS)
# 添加 child 子目錄下的cmakelist
add_subdirectory(child)
# 指定生成目標(biāo) 
add_executable(main ${DIR_SRCS})
# 添加鏈接庫(kù)
target_link_libraries(main child)
#===========================================================================================
#child目錄下的cmake就是:
cmake_minimum_required (VERSION 3.6.0)
aux_source_directory(. DIR_LIB_SRCS)
# 生成鏈接庫(kù) 默認(rèn)生成靜態(tài)庫(kù)
add_library (child ${DIR_LIB_SRCS})
#指定編譯為靜態(tài)庫(kù)
add_library (child STATIC ${DIR_LIB_SRCS})
#指定編譯為動(dòng)態(tài)庫(kù)
add_library (child SHARED ${DIR_LIB_SRCS})

在上面的例子中都是生成可執(zhí)行文件对竣,讓我們對(duì)cmakelist有了一定的了解庇楞。

現(xiàn)在到android studio中使用cmakelist:
#NDK中已經(jīng)有一部分預(yù)構(gòu)建庫(kù) ndk庫(kù)已經(jīng)是被配置為cmake搜索路徑的一部分 所以可以
findLibrary(log-lib log)
target_link_libraries( native-lib
                       ${log-lib} )
#設(shè)置cflag和cxxflag
#定義預(yù)編譯宏:TEST
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST"  )
set(CMAKE_Cxx_FLAGS "${CMAKE_Cxx_FLAGS} -DTEST"  )                       
#其實(shí)直接這樣就行
target_link_libraries( native-lib
                       log )

添加其他預(yù)編譯庫(kù)(已經(jīng)提前編譯好的庫(kù)):

#使用 IMPORTED 標(biāo)志告知 CMake 只希望將庫(kù)導(dǎo)入到項(xiàng)目中
#如果是靜態(tài)庫(kù)則將shared改為static
add_library( imported-lib
             SHARED
             IMPORTED )
# 參數(shù)分別為:庫(kù)、屬性否纬、導(dǎo)入地址吕晌、so所在地址
set_target_properties(
                       imported-lib
                       PROPERTIES 
                       IMPORTED_LOCATION
                       ${CMAKE_SOURCE_DIR}/src/${ANDROID_ABI}/libimported-lib.so )
#為了確保 CMake 可以在編譯時(shí)定位頭文件
#這樣就可以使用 #include <xx> 引入 
#否則需要使用 #include "path/xx" 
include_directories( imported-lib/include/ )

#native-lib 是自己編寫(xiě)的源碼最終要編譯出的so庫(kù)
target_link_libraries(native-lib imported-lib)
#===========================================================================================
#添加其他預(yù)編譯庫(kù)還可以使用這種方式
#使用-L指導(dǎo)編譯時(shí)庫(kù)文件的查找路徑
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Lxx")
#為了確保 CMake 可以在編譯時(shí)定位您的標(biāo)頭文件
include_directories( imported-lib/include/ )

#native-lib 是自己編寫(xiě)的源碼最終要編譯出的so庫(kù)
target_link_libraries(native-lib imported-lib)

常用指令:

#set命令表示聲明一個(gè)變量source 變量的值是后面的可變參數(shù)
set(source a b c)
message(${source})

#邏輯判斷 計(jì)較字符串
set(ANDROID_ABI "areambi-v7a")
if(${ANDROID_ABI} STREQUAL "areambi")
    message("armv5")
elseif(${ANDROID_ABI} STREQUAL "areambi-v7a")
    message("armv7a")
else()
    
endif()
//還可以在gradle中使用 arguments  設(shè)置一些配置
externalNativeBuild {
    cmake {
        arguments "-DANDROID_TOOLCHAIN=clang",  //使用的編譯器clang/gcc
                  "-DANDROID_STL=gnustl_static" //cmake默認(rèn)就是gnustl_static
        cFlags "" //這里也可以指定cflag和cxxflag,效果和之前的cmakelist里使用一樣
        cppFlags "" 
    }
} 

5.0及以下與6.0及以上的注意事項(xiàng):

6.0以下 System.loadLibrary 不會(huì)自動(dòng)為我們加載依賴(lài)的動(dòng)態(tài)庫(kù)
6.0以上 System.loadLibrary 會(huì)自動(dòng)為我們加載依賴(lài)的動(dòng)態(tài)庫(kù)
使用NDK下的ndk-depends可查看依賴(lài)關(guān)系

使用Android.mk在 >=6.0 設(shè)備上不能再使用預(yù)編譯動(dòng)態(tài)庫(kù)(靜態(tài)庫(kù)沒(méi)問(wèn)題):

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := Test
#libTest.so放在當(dāng)前文件同目錄
LOCAL_SRC_FILES := libTest.so
#預(yù)編譯庫(kù)
include $(PREBUILT_SHARED_LIBRARY)


include $(CLEAR_VARS)
#引入上面的Test模塊
LOCAL_SHARED_LIBRARIES := Test
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)

上面這段配置生成的libhllo-jni在>=6.0設(shè)備中無(wú)法執(zhí)行。

使用CMakeList.txt在 >=6.0 設(shè)備上引入預(yù)編譯動(dòng)態(tài)庫(kù):

cmake_minimum_required(VERSION 3.4.1)

file(GLOB SOURCE *.c )
add_library(
             hello-jni
             SHARED
            ${SOURCE} )
#這段配置在6.0依然沒(méi)問(wèn)題 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -L[SO所在目錄](méi)")

#這段配置只能在6.0以下使用 原因和android.mk一樣
#add_library(Test SHARED IMPORTED)
#set_target_properties(Test PROPERTIES IMPORTED_LOCATION [SO絕對(duì)地址])

target_link_libraries(  hello-jni Test )
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末临燃,一起剝皮案震驚了整個(gè)濱河市睛驳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膜廊,老刑警劉巖乏沸,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異爪瓜,居然都是意外死亡蹬跃,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)铆铆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蝶缀,“玉大人,你說(shuō)我怎么就攤上這事薄货∥潭迹” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵谅猾,是天一觀的道長(zhǎng)柄慰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)税娜,這世上最難降的妖魔是什么坐搔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮敬矩,結(jié)果婚禮上概行,老公的妹妹穿的比我還像新娘。我一直安慰自己谤绳,他們只是感情好占锯,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著缩筛,像睡著了一般消略。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瞎抛,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天艺演,我揣著相機(jī)與錄音,去河邊找鬼桐臊。 笑死胎撤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的断凶。 我是一名探鬼主播伤提,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼认烁!你這毒婦竟也來(lái)了肿男?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤却嗡,失蹤者是張志新(化名)和其女友劉穎舶沛,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體窗价,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡如庭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撼港。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坪它。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖餐胀,靈堂內(nèi)的尸體忽然破棺而出哟楷,到底是詐尸還是另有隱情,我是刑警寧澤否灾,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布卖擅,位于F島的核電站,受9級(jí)特大地震影響墨技,放射性物質(zhì)發(fā)生泄漏惩阶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一扣汪、第九天 我趴在偏房一處隱蔽的房頂上張望断楷。 院中可真熱鬧,春花似錦崭别、人聲如沸冬筒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)舞痰。三九已至土榴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間响牛,已是汗流浹背玷禽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呀打,地道東北人矢赁。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像贬丛,于是被迫代替她去往敵國(guó)和親撩银。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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