背景
公司有一部分庫是一套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
操作過后如下
然后繼續(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 即可)
結(jié)合 -DPLATFORM 以及 -DARCHS 我們可以編譯輸出任意架構(gòu)的庫