CMake实践笔记

关于CMake的可以参考网上的一个名叫《Cmake实践》的pdf教程,介绍的非常详细。

cmake工具通过在各级参与编译过程的目录中创建CMakeLists.txt文件来配置构建过程,指导怎样生成makefile。所以用cmake工具就是一个编程(编写CMakeList.txt)的过程。下面列出几个cmake的常用指令:

1.      ADD_EXECUTABLE

生成可执行文件。

格式:ADD_EXECUTABLE(exenamesrcfile1 srcfile2 … )。

2.      ADD_LIBRARY

生成库文件(包括静态库和动态库文件)

格式:ADD_LIBRARY(libname[SHARED|STATIC|MODULE]

[EXCLUDE_FROM_ALL]

source1 source2 ... sourceN)

libname不需要写全名,例如库文件libhello.so,只需要填写hello即可,cmake系统会自动为你生成libhello.X。

类型有三种:SHARED,动态库;STATIC,静态库;MODULE,在使用dyld的系统有效,如果不支持dyld,则被当作SHARED对待。

EXCLUDE_FROM_ALL参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。

3.      ADD_SUBDIRECTORY

格式:ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

这个指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置。EXCLUDE_FROM_ALL参数的含义是将这个目录从编译过程中排除,比如,工程的example,可能就需要工程构建完成后,再进入example目录单独进行构建(当然,你也可以通过定义依赖来解决此类问题)。

4.      INCLUDE_DIRECTORIES

这条指令可以用来向工程添加多个特定的头文件搜索路径,路径之间用空格分割,如果路径中包含了空格,可以使用双引号将它括起来。

5.      TARGET_LINK_LIBRARIES

格式:TARGET_LINK_LIBRARIES(targetlibrary1 library2 ...)

这个指令可以用来为target添加需要链接的共享库,target可以是一个可执行文件,也可以用于为自己编写的共享库添加共享库链接。

6.      ADD_DEPENDENCIES

定义target依赖的其他target,确保在编译本target之前,其他的target已经被构建。

格式:ADD_DEPENDENCIES(target-namedepend-target1 depend-target2 ...)

 

有了以上六个指令基本上就基本完成程序的构建了,下面来看一个例子,程序很简单,主要是看怎么编写CMakeLists.txt文件。首先,工程的目录结构如图1所示:

 CMake实践笔记_第1张图片

图1

头文件./include/def.h,./include/func.h和源文件func.c,main.c的内容分别如图2-5所示:

 CMake实践笔记_第2张图片

图2

CMake实践笔记_第3张图片

图3

CMake实践笔记_第4张图片

图4

CMake实践笔记_第5张图片

图5

下面看看各级目录中的CMakeLists.txt的内容,这才是构建的关键。

./CMakeLists.txt:

PROJECT(hello)
ADD_SUBDIRECTORY(src bin)

./src/CMakeLists.txt:

ADD_EXECUTABLE(hello main.c)
INCLUDE_DIRECTORIES(../include)
TARGET_LINK_LIBRARIES(hello func)
ADD_DEPENDENCIES(hello func)
ADD_SUBDIRECTORY(lib) 

./src/lib/CMakeLists.txt:

INCLUDE_DIRECTORIES(../../include)
ADD_LIBRARY(func STATIC func.c)

构建(外部构建)过程:首先在工程目录中创建一个build目录,执行命令:

cmake ..

make

执行完毕后,在build目录中会生成一个bin目录,这就是指令ADD_SUBDIRECTORY(src bin)设置的目标目录。bin目录中有一个可执行文件hello,还有一个lib目录,lib目录是指令ADD_SUBDIRECTORY(lib)添加的,由于没有设置目标名称,所以还是lib。在看一下lib目录的内容,里面会有一个libfunc.a,该文件是指令ADD_LIBRARY(func STATICfunc.c)指定生成的静态库文件。

动手实践一下,才发现还是蛮简单的~~

 

 

你可能感兴趣的:(CMake实践笔记)