android cmake的使用方法,Android:cmake实际指南

二、静态库与动态库构建常用变量和常用环境变量

1.变量的引用

使用“${}”,在IF中,不需要使用这种方式,直接使用变量名即可。

2.自定义变量

使用SET(OBJ_NAME xxxx),使用时${OBJ_NAME}

3.cmake的常用变量:

CMAKE_BINARY_DIR,PROJECT_BINARY_DIR,_BINARY_DIR

这三个变量内容一致,如果是内部编译,就指的是工程的顶级目录,如果是外部编译,指的就是工程编译发生的目录。

CMAKE_SOURCE_DIR,PROJECT_SOURCE_DIR,_SOURCE_DIR

这三个变量内容一致,都指的是工程的顶级目录。

CMAKE_CURRENT_BINARY_DIR:外部编译时,指的是target目录,内部编译时,指的是顶级目录

CMAKE_CURRENT_SOURCE_DIR:CMakeList.txt所在的目录

CMAKE_CURRENT_LIST_DIR:CMakeList.txt的完整路径

CMAKE_CURRENT_LIST_LINE:当前所在的行

CMAKE_MODULE_PATH:如果工程复杂,可能需要编写一些cmake模块,这里通过SET指定这个变量

LIBRARY_OUTPUT_DIR,BINARY_OUTPUT_DIR:库和可执行的最终存放目录

PROJECT_NAME:工程名字

4.cmake中调用环境变量

(1)使用 $ENV{NAME} : 调用系统环境变量,同样可以用 SET(ENV{NAME} value) 设置环境变量,注意 "ENV" 不带 "$"。

(2)CMAKE_INCLUDE_CURRENT_DIR 等于 INCLUDE_DIRECTORY(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})

5.其他的内置变量

(1)BUILD_SHARED_LIBS : 使用ADD_LIBRARY()时设置默认值

(2)CMAKE_C_FLAGS : 为c编译器设置编译参数

(3)CMAKE_CXX_FLAGS :  为c++编译器设置编译参数

6.区分debug和release

通过 ${CMAKE_BUILD_TYPE} 变量判断当前是"Release" 还是 "Debug" 版本编译。

7.指定编译32bit或64bit程序

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")

SET(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS} -m32")

三、常用指令

1.基本指令

INCLUDE_DIRECTORIES(${includedir}) #-I。

LINK_DIRECTORIES(${libdir}) #-L

TARGET_LINK_LIBRARIES(helloworld ${linkflags}) #-l

ADD_DEFINITIONS(${cflags}) #-D

ADD_DEFINATIONS:向C/CPP添加宏定义,相当于gcc中的-D,参数之间用空格分割

ADD_DEPENDICIES(target_name, depend_name):定义target对其他target的依赖关系

AUX_SOURCE_DIRECTORY(dir VARIBLE):把目录下的所有源文件保存在变量中,基本用来创建源文件列表

ADD_EXECUTABLE:指定目录,生成执行文件

EXEC_PROGRAM:外部调用指令,可移执行任何外部命令,后面加参数,例子如下:

EXEC_PROGERAM(ls ARGS"*.c" OUTPUT_VARIBLE LS_OUTPUT RETURN_VALUE LS_RVALUE)

IF(not LS_RVALUE)

MESSAGE(STATUS "xxx")

ENDIF(not LS_RVAULE)

PS:这里执行ls *.c指令,执行成功的话,返回0。

2.FILE指令

FILE(WRITE file_name "content")

FILE(APPEND file_name"content")

FILE(READ file_name varible)

FILE(WRITE file_name"content")

# 查找当前目录下的所有源文件

set(CURR_DIR ${CMAKE_CURRENT_LIST_DIR}/)

file(GLOB_RECURSE SOURCE_FILES ${CURR_DIR} ${CURR_DIR}/*.cpp ${CURR_DIR}/*.c)

3.FIND_系列指令

LIBRARY( name path):

FIND_LIBRARY(Xorg X11/usr/lib64)

IF(not Xorg)

MESSAGE(STATUS"no Xorg")

ENDIF(not Xorg)

FILE( name path)

PATH( name path)

PROGRAM( name path)

PACKAGE( [major.minor][QUIET][NO MODULE][[REQUIRED][COMPONTS][componts....]])

最后一条,用来调用放在CMAKE_MODULE_PATH下的Find.cmake模块,也可以自定义Find模块

首先通过SET(CMAKE_MODULE_PATH/home/...)来指定位置

4.控制指令

IF(expression),ELSE(expression),ENDIF(expression)

express举例:

否定:空,0,N,NO,OFF,FALSE,NOTFOUND或_NOTFOUND

肯定:COMMAND cmd,EXISTS dir/file,variable MARCHES regex等等

示例:

IF (${CMAKE_BUILD_TYPE} STREQUAL "Debug")

message(WARNING "++++++ Debug ++++++++")

ENDIF(${CMAKE_BUILD_TYPE} STREQUAL "Debug")

5.循环指令

(1) 循环添加依赖库

set(LIB_BASE mpkernel mputility mpstream)foreach(lib ${LIB_BASE})

add_library(${lib} STATIC IMPORTED)

set_property(TARGET ${lib} PROPERTY IMPORTED_LOCATION ${LIB_BASE_DIR}/lib${lib}.a)

endforeach()

(2)循环拷贝动态到输出目录,打包到APK

set(BOKEHPP_SHARED_LIBS dualcam_bokeh bokehplus_image )

foreach(lib ${BOKEHPP_SHARED_LIBS})set(THE_LIBRARY ${BOKEHPP_SHARED_LIBS}/lib${lib}.so)

add_custom_command(TARGET ${PROJECT_NAME}

POST_BUILD # Adds a post-build eventto ${PROJECT_NAME}

COMMAND ${CMAKE_COMMAND}-E copy_if_different # which executes "cmake - E copy_if_different..."${THE_LIBRARY} #

$ #

)

endforeach()

四、模块的使用和自定义模块

FIND_PACKAGE

每一个模块都会产生如下变量

_FOUND

_INCLUDE_DIR

_LIBRARY or _LIBRARIES

如果_FOUND为真,把_INCLUDE_DIR加入到INCLUDE_DIRECTORIES中,_LIBRARY加入到TARGET_LINK_LIBRARIES中。

编写属于自己的FindHello模块:

1.FIND_PATH(HELLO_INCLUDE_DIR hello.h /usr/include/hello /usr/local/include/hello)2.FIND_LIBRARY(HELLO_LIBRARY_DIR NAMES hello PATH /usr/lib /usr/local/lib)

IF(HELLO_INCLUDE_DIR AND HELLO_LIBRARY)

SET(HELLO_FOUND TRUE)

ENDIF(HELLO_INCLUDE_DIR)3.FIND_PACKAGE([major.minor][QUIET][NO_MODULE]

[[REQUIRED|COMPONENTS][componets...]])

QUIET参数:去掉输出信息

REQUIRED参数:共享库是否是工程必须的,如果是必须的,那么找不到

如果在src中想调用hello模块中的内容

FIND_PACKAGE(HELLO)

为了可以让工程找到FindHELLO.cmake

在主工程的CMakeList.txt中,SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_PATH}/cmake)

通过设置FIND_PACKAGE(HELLO QUIET)可以去掉输出信息

五、系统默认变量和内置变量

1.在不同的平台编译的时候,会用到一些系统内置的变量,比如操作系统名称,版本号之类:

CMAKE_SYSTEM:系統全名,如 "Linux-2.4.22","FreeBSD-5.4-RELEASE" 或 "Windows 5.1"CMAKE_SYSTEM_NAME:系統名称,如"Linux", "FreeBSD" or "Windows",注意大小写

CMAKE_SYSTEM_VERSION:只显示系统全名中的版本部分

CMAKE_SYSTEM_PROCESSOR:CPU名称

2.系统标志:

下面的变量都是BOOL类型的,如果与当前系统或编译器相符,值为True,反之为False

UNIX

WIN32forMINGW,CYGWIN,MSYS

APPLE

BORLAND

WATCOM

MSVC,MSVC_IDE,CMAKE_COMPILER_2005,MSVC60/70/71/80/90/10,针对不同的Visual C++CMAKE_COMPILER_IS_GUNCXX/CMAKE_COMPILER_IS_GUNCC

3.编译时选项:

BUIlD_SHARED_LIBS:将所有程序库的target设置成共享库

CMAKE_BUIlD_TYPE:控制构建类型,以下为可选参数

None:default;Debug:生成调试信息;Release:发布版本,进行最佳化,需要注意这个值不会在configure的时候自动初始化,需要手动指定

CMAKE_C_FLAGS

CMAKE_C_FLAGS_DEBUG

CMAKE_C_FLAGS_RELEASE

CMAKE_CXX_FLAGS

CMAKE_CXX_FLAGS_DEBUG

CMAKE_CXX_FLAGS_RELEASE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值