1. 程式人生 > 其它 >android開發cmake編譯多個有相互依賴的c/cpp模組原始碼的配置方法

android開發cmake編譯多個有相互依賴的c/cpp模組原始碼的配置方法

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會自動匹配