关于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所示:
图1
头文件./include/def.h,./include/func.h和源文件func.c,main.c的内容分别如图2-5所示:
图2
图3
图4
图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)指定生成的静态库文件。
动手实践一下,才发现还是蛮简单的~~