NDK学习系列--第四篇
简介
今天想给总结一下自己对cmake的理解,通过前几天的学习,我们可以看到cmakelist文件的作用是非常大的,通过这文件,我们才能正常的使用ndk。除了cmake以外,还有makefile也是可以用来构建NDK项目的。
CMakeLists文件有啥作用?
CMake 是一个跨平台的自动化建构系统,注意这个自动。它通过 CMakeLists.txt 文件来描述NDK的构建过程,可以通过里面的配置产生标准的构建文件,如 Unix 的 Makefile 或Windows Visual C++ 的 projects/workspaces ,苹果平台,可以生成 xcode,在 Windows 平台,可以生成 MSVC 的工程文件。也就是说CMakeLists是平台无关的。文件 CMakeLists.txt 需要我们自己去编写,也可以通过编写脚本进行半自动的生成。简单点讲,我们按照CMake语法规则,在CMakeLists.txt里写好我们的项目的编译规则,然后进行编译即可。相比makefile来说CMake实在是便利太多了,使用makefile会让人感觉头秃。
下面介绍几个常用的cmake语句,学了这些基本上就能应付大多数情况了:
project (HELLO) #指定项目名称,生成的VC项目的名称;
>>使用${HELLO_SOURCE_DIR}表示项目根目录
include_directories:指定头文件的搜索路径,相当于指定gcc的-I参数
>> include_directories (${HELLO_SOURCE_DIR}/Hello) #增加Hello为include目录
link_directories:动态链接库或静态链接库的搜索路径,相当于gcc的-L参数
>> link_directories (${HELLO_BINARY_DIR}/Hello) #增加Hello为link目录
add_subdirectory:包含子目录
>> add_subdirectory (Hello)
add_executable:编译可执行程序,指定编译,好像也可以添加.o文件
>> add_executable (helloDemo demo.cxx demo_b.cxx) #将cxx编译成可执行文件——
add_definitions:添加编译参数
>> add_definitions(-DDEBUG)将在gcc命令行添加DEBUG宏定义;
>> add_definitions( “-Wall -ansi –pedantic –g”)
target_link_libraries:添加链接库,相同于指定-l参数
>> target_link_libraries(demo Hello) #将可执行文件与Hello连接成最终文件demo
add_library:
>> add_library(Hello hello.cxx) #将hello.cxx编译成静态库如libHello.a
makefile是什么?
按照百度百科的答案是:一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,也可以执行操作系统的命令。
Makefile 文件描述了整个工程的编译、连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译、需要创建哪些库文件以及如何创建这些库文件、如何最后产生我们想要的可执行文件。尽管看起来可能是很复杂的事情,但是为工程编写Makefile 的好处是能够使用一行命令来完成“自动化编译”,一旦提供一个(通常对于一个工程来说会是多个)正确的 Makefile。编译整个工程需要做的事情一件事就是在命令行提示符下输入make指令。最后通过指令就可以编译,是否觉得效率很高呢?非也,如果这么好的话,为什么谷歌不一致使用makefile。makefile需要描述工程的编译、连接等规则,这就需要特定的语法来编写规则,makefile的语法规则还不是特别容易就上手的,如果为了编译工作就需要去学习一套语法,这样的话对很多人来说都是望而却步了。还有另一个非常致命的缺点,makefile不支持多平台,也就是说你在window平台上面可以正常运行的makefile,在linux上面就不行了,你还得另外去一套规则。这不得把本来就头发稀少的程序员们逼疯,让人感觉头顶更凉爽了。
因此后面高版本的AS就不使用makefile来进行构建ndk了。而是使用“自动”、编写容易、支持多平台的CMake。