android cmakelists 简要说明

106 阅读1分钟

常用命令

cmake_minimum_required(VERSION 3.4.1)
aux_source_dirction(. DIR_SRCS)
查找当前目录下所有源文件,并将源文件的名称保存到变量 DIR_SRCS中。 且不能查找子目录
添加库
add_library(<name> [STATIC|SHARED|MODULE] [
EXCLUDE_FROM_ALL]  source1 source2 source3)
导入预编译库
add_library(<name> [STATIC|SHARED|MODULE|UNKNOWN] IMPORTED)
set_target_properties(<targetname> PROPERTIES IMPORTED_LOCATION 导入库的路径)

#以导入test库为例子
add_library(test SH/ARED IMPORTED)
set_target_properties(test PROPERTIES IMPORTED_LOCATON ${haha}/libtest.so)
常用命令set
1.设置可执行文件的输出路径
set(EXCUTABLE_OUTPUT_PATH [output_path])
2.设置库文件的输出路径
set(LIBRARY_OUTPUT_PATH)
3.设置C++编译参数 
set(CAMKE_CXX_FLAGS "-Wall std=c++11")
4.设置源文件集合
set(SOURCE_FILES main.cpp test.cpp)
include_directories
include_dirctories(./include ${MY_INCLUDE})
设置头文件目录的,相当于g++ 中的 -I参数选项
add_excutable
添加可执行文件
add_excutable(<name> ${src_list}) 
target_link_libraries
target_link_libraries(<name> lib1 lib2 lib3)

1.将若干个库连接到目标文件
2.被连接的库是有顺序的。 lib1 依赖于lib2 ,lib2 依赖于lib3
3.如果静态库出现相互依赖,cmake允许环形依赖
    add_library(A STATIC a.c)
    add_library(B STATIC b.c)
    target_link_libraries(A B)
    target_link_libraries(B A)
    add_excutable(main main.c)
    target_link_libraries(main A)
    
4.第一个参数为目标库的名字
add_definitions ??
add_definitions(-DFOO -DDEBUG ...)
为当前目录及子目录下的源文件加入有 -D引入的define flag
add_subdirectory
add_subdirectory(sub_dir [binary_dir])
如果当前目录下还有子目录,可以使用该命令,但是子目录还需要有CMakeLists.txt
file 命令
set_directory_properties
set_directory_properties(PROPERTIES prop1 value1 prop2 valu2)

prop:INCLUDE_DIRECTORIES LINK_DIRECTORIES INCLUDE_REGULAR_EXPRESSION ADDTIONAL_MAKE_CLREAN_FILES
set_property
在给定的作用域内设置一个命名属性

set_property(<GLOBAL|
                DIRECTORY [dir]|
                TARGET [target ... ] | SOURCE [src1 ...]|
                TEST [tes1]|
                CACHE [entry1 ...]> 
                [APPEND]
                property <name> [value ...])

多个源文件怎么处理

当前目录下
aux_source_directory(. DIR_SCRS)

或者
file(GLOB DIR_SRCS *.c *.cpp)

add_library(native-lib SHARED ${DIR_SRCS})
多个目录下
场景 主目录和 子目录child

#主目录的CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 3.4.1)
#将当前目录下的源文件存入变量DIR_SRCS中年
aux_source_directory(. DIR_SRCS)
#将声明当前的库
add_library(native-lib SHARED ${DIR_SRCS})
#将子目录的库声明
add_subdirectory(child)
#连接库
target_link_libraries(native-lib child)

#child的CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 3.4.1)
 aux_source_directory(. DIR_LIB_SRCS)
 add_library(child SHARED ${DIR_LIB_SRCS})

添加预编译库(android 6.0之前)

cmake_minimum_required(VERSION 3.4.1)

add_library(import-lib SHARED IMPORTED)

set_target_properties(import-lib PROPERTIES IMPORTED_LOCATION ./xxx/lib-import-lib.so)

aux_source_directory(. SRCS)

add_library(native-lib SHARED ${SRCS})

target_link_libraries(native-lib import-lib)

添加预编译库(android 6.0之后)

set(CMAKE_C_FLAGS "${CAMKE_C_FLAGS} -l [so所在目录]")
    
其实就是给CMAKE_C_FLAGS 追加-l参数

添加头文件

cmake_minimu_required(VERSION 3.4.1)
include_directorys(<头文件目录>)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -l [so文件目录]")

aux_source_direction(. SRCS)
add_library(native-lib SHARED ${SRCS})
target_link_libraries(native-lib improted-lib)

build.gradle中的配置