cmake是一款生成makefile的软件;在生成makefile之前,首先是写一个CMakeLists.txt文件;
以下为典型例子:
先看目录tree, 在test文件夹中有:include目录, source目录, 以及main.c
source目录下有afile.c, bfile.c
include目录下有temp.h
afile.c中:
#include "../include/temp.h" #include <stdio.h> void func_a() { printf("this is func_a test "); }
bfile.c中:
#include "../include/temp.h" #include <stdio.h> void func_b() { printf("this is func_b test "); }
temp.h中:
void func_a(); void func_b();
main.c中:
#include "include/temp.h" int main() { func_a(); func_b(); printf("hello world "); return 0; }
在test目录下新建文件CMakeLists.txt, 内容如下:
PROJECT(main) CMAKE_MINIMUM_REQUIRED(VERSION 2.6) ADD_DEFINITIONS(-DENABLEDEBUG) ADD_DEFINITITONS(-g) AUX_SOURCE_DIRECTORY(source SRC_DIR) SET(MAIN_DIR main.c ${SRC_DIR}) ADD_EXECUTABLE(main ${MINI_DIR})
PROJECT指令的语法是:
SET指令的语法是:
只需要了解SET指令可以用来显式的定义变量即可。比如我们用到的是SET(SRC_LIST main.c),如果有多个源文件,也可以定义成:SET(SRC_LIST main.c t1.c t2.c)
ADD_EXECUTABLE(hello ${SRC_LIST})
定义了这个工程会生成一个文件名为hello的可执行文件,相关的源文件是SRC_LIST中定义的源文件列表; ${}是表示取值;
向C/C++编译器添加-D定义,比如:ADD_DEFINITIONS(-DENABLE_DEBUG),参数之间用空格分割
ADD_DEFITIONS(-g)
AUX_SOURCE_DIRECTORY(dir VARIABLE)作用是发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表
写完CMakeLists.txt之后;
cmake . 之后就可以发现生成了makefile;
make即可;
动态库构建
PROJECT (main) ADD_DEFINITIONS(-DPOSIX) ADD_DEFINITIONS(-DDEBUG) AUX_SOURCE_DIRECTORY(source DIR_SRC) SET(MAIN_SRCS ${DIR_SRC}) ADD_LIBRARY(main SHARED ${MAIN_SRCS})
静态库构建
PROJECT (main) ADD_DEFINITIONS(-DPOSIX) ADD_DEFINITIONS(-DDEBUG) AUX_SOURCE_DIRECTORY(source DIR_SRC) SET(MAIN_SRCS ${DIR_SRC}) ADD_LIBRARY(main STATIC ${MAIN_SRCS})
安装库和头文件
INSTALL(TARGETS main LIBRARY DESTINATION lib)
静态库则加入:
INSTALL(TARGETS main ARCHIVE DESTINATION lib)
INSTALL(FILES include/tmp.h DESTINATION include/lib)
3.通过:
cmake -DCMAKE_INSTALL_PREFIX=/usr .
make
make install
可以将头文件和共享库安装到系统目录/usr/lib和/usr/include中