android開發cmake編譯多個有相互依賴的c/cpp模組原始碼的配置方法
阿新 • • 發佈:2022-05-13
android開發cmake編譯多個有相互依賴的c/cpp模組原始碼的配置方法
1. 專案目錄結構配置如下:
root-project //根目錄直接引用根目錄下的CMakeLists
cpp1Project
/src/main/c/CMakeLists.txt //cpp1的
cpp2Project
/src/main/cpp/CMakeLists.txt //cpp2的
CMakeLists.txt //根目錄的,它將引用cpp1Project和cpp2Project下的CMakeLists.txt檔案
2. root-project根目錄下的build.gradle配置如下:
defaultConfig { externalNativeBuild { cmake { arguments '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=c++_shared', '-DCMAKE_VERBOSE_MAKEFILE=ON' //-D是傳遞編譯引數,如-DVERBOSE=1開啟cmake編譯log開關 cppFlags '-Wl,--gc-sections', '-fno-exceptions', '-fno-rtti', '-fvisibility=hidden' cFlags '-Wl,--gc-sections', '-fvisibility=hidden' //上面兩行Flags配置是sections節區優化配置 abiFilters = ["armeabi-v7a"] //指定編譯的abi類似 } } } externalNativeBuild { cmake { path "CMakeLists.txt" //引用根目錄下的CMakeLists.txt } } ndk{ abiFilters = ["armeabi-v7a"] //指定打包的abi類似,和指定編譯的abi類似有點不一樣哦 } //注意:如果cpp1Project想單獨編譯自己的c原始碼,也可以配置類似root-project下的build.gradle配置
3. root-project根目錄下的CMakeLists.txt配置如下:
cmake_minimum_required(VERSION 3.4.1)
//就那麼多配置,包含root-project根目錄下兩個子專案的CMakeLists.txt所在的目錄。
//cmake會自動找到並該目錄下的CMakeLists.txt檔案並執行
add_subdirectory(cpp1Project/src/main/c)
add_subdirectory(cpp2Project/src/main/cpp)
4. cpp1Project下生成libhook.a靜態庫的CMakeLists.txt檔案配置如下:
cmake_minimum_required(VERSION 3.4.1) project(hook C) //指定為c專案,類似有project(hook CXX C ASM) set(hook_source_dir ${CMAKE_CURRENT_SOURCE_DIR}) //定義變數hook_source_dir set(hook_source ${hook_source_dir}/core.c ${hook_source_dir}/hook.c ...) //定義變數hook_source 也可以使用file GLOB搞定 add_library(hook STATIC ${hook_source}) //生成libhook.a靜態庫,也可以使用SHARED生成動態庫 find_library(log-lib log)//查詢系統目錄(\21.4.7075529\platforms\android-21\arch-arm\usr\lib)下的liblog.so庫,取名為log-lib //target_include_directories與include_directories區別(適用範圍不同): //target_include_directories包含的標頭檔案使用範圍僅限與當前目標或者說當前目錄 //include_directories包含的標頭檔案,子目標或者說子目錄也可以使用到,如果根目錄下使用了那就子目錄也有效,注意不能濫用 target_include_directories(hook PUBLIC ${hook_source_dir}) //包含標頭檔案,不同於include_directories target_link_libraries(xhook ${log-lib}) //連結上面find到的log-lib庫
5. cpp2Project下生成libtrace.so動態庫(依賴libhook.a靜態庫)的CMakeLists.txt檔案配置如下:
cmake_minimum_required(VERSION 3.4.1) project(trace CPP) include_directories( ${CMAKE_SOURCE_DIR} ) //cpp2Project使用cpp1Project下的標頭檔案 //或者target_include_directories(trace PUBLIC ${CMAKE_SOURCE_DIR}/cpp1Project/src/main/c/hook/),不過要放在add_library(trace ...)後面,因為生成了target才能找到trace目標 include_directories(${CMAKE_SOURCE_DIR}/cpp1Project/src/main/c/hook/) add_library(trace SHARED Trace.cc) //生成libtrace.so動態庫 target_link_libraries(trace //將log庫和hook庫連結到目標trace log //連結系統目錄下的liblog.so動態庫,不用指定字首lib和字尾.so會自動匹配 hook) //連結上面cpp1Project生成的libhook.a靜態庫,不用指定字首lib和字尾.a會自動匹配