Android:cmake开发指南
一、静态库与动态库构建
1.编译共享库:
ADD_LIBRARY(hello SHARED ${SHARED_LIBRARY})
ADD_LIBRARY(hello STATIC ${STATIC_LIBRARY})
因为默认规则是不能有相同名字的共享库与静态库,所以当生成静态库的时候,共享库会被删除,所以需要通过SET_TARGET_PROPERTIES()来解决这个问题,例子:
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
cmake在构建一个target的时候,会删除之前生成的target,一样是通过设置SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)来达到目的。
SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION )
二、静态库与动态库构建常用变量和常用环境变量
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
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举例:
否定:空,,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 event to ${PROJECT_NAME}
COMMAND ${CMAKE_COMMAND} -E copy_if_different # which executes "cmake - E copy_if_different..."
${THE_LIBRARY} # <--this is in-file
$<TARGET_FILE_DIR:${PROJECT_NAME}> # <--this is out-file path
) endforeach()
四、模块的使用和自定义模块
FIND_PACKAGE
_FOUND
_INCLUDE_DIR
_LIBRARY or _LIBRARIES
如果_FOUND为真,把_INCLUDE_DIR加入到INCLUDE_DIRECTORIES中,_LIBRARY加入到TARGET_LINK_LIBRARIES中。
.FIND_PATH(HELLO_INCLUDE_DIR hello.h /usr/include/hello /usr/local/include/hello)
.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)
.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名称
UNIX
WIN32 for MINGW,CYGWIN,MSYS
APPLE
BORLAND
WATCOM
MSVC,MSVC_IDE,CMAKE_COMPILER_2005,MSVC60/////,针对不同的Visual C++
CMAKE_COMPILER_IS_GUNCXX/CMAKE_COMPILER_IS_GUNCC
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
Android:cmake开发指南的更多相关文章
- Android SDK 开发指南
Android SDK 开发指南 视频详解 以下视频是对融云 Android SDK 开发使用的详细讲解,您可以在阅读文档时配合学习. 更多视频教程如下: CSDN 融云 Android SDK ...
- Android L开发指南
导语:Android下一代操作系统“ L”对开发者意味着什么?ART模式能否让应用的体验超越苹果? 刚刚结束的 Google I/O大会上,Android下一代操作系统“ L”带来不少惊喜.新系统运行 ...
- 【原创】轻量级即时通讯技术MobileIMSDK:Android客户端开发指南
申明:MobileIMSDK 目前为个人维护的原创开源工程,现陆续整理了一些资料,希望对需要的人有用.如需与作者交流,见文章底签名处,互相学习. MobileIMSDK开源工程的代码托管地址请进入 G ...
- Android NDK开发指南---Application.mk文件和android.mk文件
https://android.googlesource.com/platform/development/+/donut-release/ndk/docs/OVERVIEW.TXT https:// ...
- Android NDK开发指南(二)Android.mk文件
http://www.cnblogs.com/yaozhongxiao/archive/2012/03/06/2382225.html 1. 概述 Android.mk文件是用来描述build sy ...
- Android NDK开发指南(一) Application.mk文件
http://www.cnblogs.com/yaozhongxiao/archive/2012/03/06/2381586.html Application.mk目的是描述在你的应用程序中所需要的模 ...
- 腾讯信鸽推送Android SDK快速指南
信鸽Android SDK是一个能够提供Push服务的开发平台,提供给开发者简便.易用的API接口,方便快速接入.目前支持Android 2.2及以上版本系统.本文档将引导用户以最快的速度嵌入信鸽SD ...
- 基于虹软人证核验 2.0 Android SDK开发集成入门
一.功能介绍虹软人证核验 2.0 SDK(以下简称SDK)包含人脸检测.人脸跟踪.人证核验等能力,主要实现人证的1:1比对.其中暴露对外的功能方法有:active 引擎激活init 引擎初始化inpu ...
- android studio 开发环境配置
android studio 开发环境配置 参考: 第一次使用Android Studio时你应该知道的一切配置 https://www.cnblogs.com/qianguyihao/p/43909 ...
随机推荐
- Linux学习笔记(十二)VIM编辑器
一.概述 VI Visual interface 可视化接口,类似于Windows中的记事本 VI->VIM 操作模式: (1)Command mode 命令模式 (2)Insert mode ...
- less匹配模式
less里面的匹配模式相当于js里面的if,但又不完全是,比如用css画一个三角 html <div class="sanjiao"></div> less ...
- TCP的三次握手与四次挥手的理解
本文经过借鉴书籍资料.他人博客总结出的知识点,欢迎提问 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生:给字节编上 ...
- 前端与SQL
转载自:http://developer.51cto.com/art/201706/542163.htm
- 关于反编译pyc的一点技巧
现在最流行的是用 https://github.com/rocky/python-uncompyle6 但是有些python小版本不一样,比如2.7.6的某版本,开头的magic number在这个项 ...
- JVM之Java运行时数据区(线程隔离区)
来源 JVM会在会在执行Java程序过程中把所管理的内存划分为若干区域,主要包括程序计数器(Program Counter Register),虚拟机栈(VM Stack),本地方法栈(Native ...
- Ubuntu安装依赖文件
我们在安装软件的时候,有时会出现由于依赖的软件没有被安装,会导致软件安装的失败,其实我们可以用命令来安装依赖的软件,这里以Ubuntu为例进行说明. 我在安装wps-office的时候,显示安装成功了 ...
- gcc的作用
把代码编译成二进制文件 预处理----头文件,宏定义展开,条件编译 干掉注释代码 编译成汇编代码 生成目标代码.o (还不能执行) 链接(动态库)生成可执行程序 xxx.out 运行前,内存已经存在分 ...
- 2019HDU多校第四场 K-th Closest Distance ——主席树&&二分
题意 给定 $n$ 个数,接下来有 $q$ 次询问,每个询问的 $l, r, p, k$ 要异或上一次的答案,才是真正的值(也就是强制在线).每次询问,输出 $[l, r]$ 内第 $k$ 小的 $| ...
- ES6-12.Symbol
Symbol是ES6新增的原始类型数据,引入的初衷是为了对象可以有永不重复的属性名. 所以属性名可以是字符串外,还可以是Symbol值: const a = Symbol("a") ...