iOS 使用 Cmake 生成 framework 庫

背景

公司有一部分庫是一套c++代碼言缤,要在android和iphone兩種手機(jī)上運(yùn)行源织,就要在分別編譯android和iphone兩個(gè)平臺(tái)下的動(dòng)態(tài)庫挤聘。android開發(fā)目前是用 Android Studio(SDK/NDK), iphone開發(fā)是用XCode.當(dāng)你增加或減少一個(gè)源代碼文件后舷手,要在Android Studio和XCode內(nèi)分別添加這個(gè)源代碼着倾。隨著時(shí)間的推移拾酝,源文件變來變?nèi)ィ銜?huì)煩不勝煩卡者。

目的

本文描述如何用cmake蒿囤,在android和iphone兩個(gè)平臺(tái)下,生成各自的庫文件崇决,供app調(diào)用

安裝 cmake

如何安裝再次就不過多的累贅了材诽,各位看官老爺們自行百度吧,安裝完成后我們可以通過命令行 cmake --version 語句來查看

[圖片上傳失敗...(image-81990b-1622798273971)]

制作CMakeLists.txt

根據(jù) cmake 官方文檔 framework恒傻,制作的CMakeLists.txt內(nèi)容如下,注意放在 C/C++ 源碼目錄下:
#注:此處TestDemo為我編譯的靜態(tài)庫名字岳守,需要替換
#DROOT是系統(tǒng)變量,主要指定頭文件和鏈接庫的路徑 此處可替換成自己對(duì)應(yīng)路徑

cmake_minimum_required(VERSION 3.2)
project (TestDemo C CXX)

MESSAGE( STATUS "CMAKE_CXX_FLAGS: " ${CMAKE_CXX_FLAGS} )
# 工程名
set(PROJECT_NAME TestDemo)

# 源文件
# aux_source_directory為包含指定目錄下所有的源文件
# 若不需要包含所有的源文件碌冶,則使用set定義湿痢,如:set(SRC_FILES 1.cpp 2.cpp)
# aux_source_directory(. SRC_FILES)
set(SRC_FILES
    CXX.cpp)

# 頭文件
# 若指定多個(gè)目錄,使用空格分隔 .表示當(dāng)前項(xiàng)目路徑
include_directories($ENV{DROOT}/inc .)


# 編譯時(shí)鏈接路徑 此處對(duì)不同架構(gòu)時(shí)的鏈接路徑做了一些處理(如果不需要鏈接其他庫可以注釋掉)
if(${ARCHS} STREQUAL "arm64")
    set(LIB_DIR ios_arm64_r)
elseif(${ARCHS} STREQUAL "armv7")
    set(LIB_DIR ios_armv7_r)
elseif(${ARCHS} STREQUAL "armv7s")
    set(LIB_DIR ios_armv7s_r)
elseif(${ARCHS} STREQUAL "i386")
    set(LIB_DIR ios_i386_r)
elseif(${ARCHS} STREQUAL "x86_64")
    set(LIB_DIR ios_x86_64_r)
endif()
    link_directories($ENV{DROOT}/bin/${LIB_DIR})

# 生成目標(biāo) STATIC和ARCHIVE對(duì)應(yīng)靜態(tài)庫 SHARED和LIBRARY對(duì)應(yīng)動(dòng)態(tài)庫
    add_library(${PROJECT_NAME} STATIC ${SRC_FILES})

# 鏈接/安裝
    target_link_libraries(${PROJECT_NAME}  pthread dl)

有了 CMakeLists.txt 我們還需要一個(gè) ios.toolchain.cmake 文件扑庞,文件的編輯內(nèi)容如:ios.toolchain.cmake

Build

在同級(jí)目錄下新建 build 目錄用于存放編譯輸出文件

mkdir build
cd build
cmake .. -G Xcode -DCMAKE_TOOLCHAIN_FILE=../ios.toolchain.cmake -DPLATFORM=OS64 -DENABLE_BITCODE=FALSE


#注:-DENABLE_BITCODE=FALSE 此處默認(rèn)將bitcode模式關(guān)閉 如果鏈接的第三方庫支持bitcode模式可以不加-DENABLE_BITCODE=FALSE

操作過后如下

企業(yè)微信截圖_66e4569c-840c-442e-a707-ffeedb855cca.png

然后繼續(xù)執(zhí)行

cmake --build . --config Debug

#注:gmhelper.xcodeproj 可以通過xcode打開進(jìn)行繼續(xù)編譯
#不過也可以繼續(xù)選擇命令行編譯 (需要編譯 Release 版將替換 Debug 即可)

此時(shí) Debug-iphoneos 目錄里會(huì)生成編譯好的靜態(tài)庫(動(dòng)態(tài)庫編譯只需將 CMakeLists.txt 里 add_library 的 STATIC 改為 SHARED 即可)

企業(yè)微信截圖_df4d929e-9e9c-4d7f-ab37-1e9d940f5e58.png

結(jié)合 -DPLATFORM 以及 -DARCHS 我們可以編譯輸出任意架構(gòu)的庫

image.png

在這里我只是簡單講解了使用及其流程譬重,后邊我們可以將這些命令寫成腳本,然后配置也可以做成動(dòng)態(tài)的罐氨, git 一個(gè)方便的小工具,感興趣的可以去看看 ios-cmake

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末臀规,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子栅隐,更是在濱河造成了極大的恐慌塔嬉,老刑警劉巖玩徊,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谨究,居然都是意外死亡恩袱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門胶哲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畔塔,“玉大人,你說我怎么就攤上這事鸯屿〕憾郑” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵寄摆,是天一觀的道長谅辣。 經(jīng)常有香客問我,道長婶恼,這世上最難降的妖魔是什么屈藐? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮熙尉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搓扯。我一直安慰自己检痰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布锨推。 她就那樣靜靜地躺著铅歼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪换可。 梳的紋絲不亂的頭發(fā)上椎椰,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音沾鳄,去河邊找鬼慨飘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛译荞,可吹牛的內(nèi)容都是我干的瓤的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼吞歼,長吁一口氣:“原來是場噩夢啊……” “哼圈膏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起篙骡,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤稽坤,失蹤者是張志新(化名)和其女友劉穎丈甸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尿褪,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡睦擂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茫多。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祈匙。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖天揖,靈堂內(nèi)的尸體忽然破棺而出夺欲,到底是詐尸還是另有隱情,我是刑警寧澤今膊,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布些阅,位于F島的核電站,受9級(jí)特大地震影響斑唬,放射性物質(zhì)發(fā)生泄漏市埋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一恕刘、第九天 我趴在偏房一處隱蔽的房頂上張望缤谎。 院中可真熱鬧,春花似錦褐着、人聲如沸坷澡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽频敛。三九已至,卻和暖如春馅扣,著一層夾襖步出監(jiān)牢的瞬間斟赚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工差油, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拗军,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓蓄喇,卻偏偏與公主長得像食绿,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子公罕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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