背景
公司有一部分庫是一套c++代碼,要在android和iphone兩種手機上運行,就要在分別編譯android和iphone兩個平臺下的動態庫。android開發目前是用 Android Studio(SDK/NDK), iphone開發是用XCode.當你增加或減少一個源代碼文件后,要在Android Studio和XCode內分別添加這個源代碼。隨著時間的推移,源文件變來變去,你會煩不勝煩。
目的
本文描述如何用cmake,在android和iphone兩個平臺下,生成各自的庫文件,供app調用
安裝 cmake
如何安裝再次就不過多的累贅了,各位看官老爺們自行百度吧,安裝完成后我們可以通過命令行 cmake --version
語句來查看
[圖片上傳失敗...(image-81990b-1622798273971)]
制作CMakeLists.txt
根據 cmake 官方文檔 framework,制作的CMakeLists.txt內容如下,注意放在 C/C++ 源碼目錄下:
#注:此處TestDemo為我編譯的靜態庫名字,需要替換
#DROOT是系統變量,主要指定頭文件和鏈接庫的路徑 此處可替換成自己對應路徑
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)
# 頭文件
# 若指定多個目錄,使用空格分隔 .表示當前項目路徑
include_directories($ENV{DROOT}/inc .)
# 編譯時鏈接路徑 此處對不同架構時的鏈接路徑做了一些處理(如果不需要鏈接其他庫可以注釋掉)
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})
# 生成目標 STATIC和ARCHIVE對應靜態庫 SHARED和LIBRARY對應動態庫
add_library(${PROJECT_NAME} STATIC ${SRC_FILES})
# 鏈接/安裝
target_link_libraries(${PROJECT_NAME} pthread dl)
有了 CMakeLists.txt 我們還需要一個 ios.toolchain.cmake 文件,文件的編輯內容如:ios.toolchain.cmake
Build
在同級目錄下新建 build 目錄用于存放編譯輸出文件
mkdir build
cd build
cmake .. -G Xcode -DCMAKE_TOOLCHAIN_FILE=../ios.toolchain.cmake -DPLATFORM=OS64 -DENABLE_BITCODE=FALSE
#注:-DENABLE_BITCODE=FALSE 此處默認將bitcode模式關閉 如果鏈接的第三方庫支持bitcode模式可以不加-DENABLE_BITCODE=FALSE
操作過后如下
企業微信截圖_66e4569c-840c-442e-a707-ffeedb855cca.png
然后繼續執行
cmake --build . --config Debug
#注:gmhelper.xcodeproj 可以通過xcode打開進行繼續編譯
#不過也可以繼續選擇命令行編譯 (需要編譯 Release 版將替換 Debug 即可)
此時 Debug-iphoneos 目錄里會生成編譯好的靜態庫(動態庫編譯只需將 CMakeLists.txt 里 add_library 的 STATIC 改為 SHARED 即可)
企業微信截圖_df4d929e-9e9c-4d7f-ab37-1e9d940f5e58.png
結合 -DPLATFORM 以及 -DARCHS 我們可以編譯輸出任意架構的庫
image.png