CMake是一个跨平台的编译工具,可以用简单的语句来描述个平台的编译过程。使用cmake 来编译代码十分简单,方便,cmake是一个生成编译脚本的工具,在linux 它会生成对应的makefile文件,然后调用makefile来编译代码。
1、编译一个简单的打印hello world程序
main.c的内容很简单,就是打印hello world
#include <stdio.h>
#include <string.h>
int main()
{
printf("hello world!\n");
return 0;
}
CMakeLists.txt 里面的内容也很简单,相应的注释已经贴在文件里面
# 设置工程的名称
PROJECT(ProjTest)
# 变量SRCS保存当前目录下所有的源码文件 . 代表当前目录
AUX_SOURCE_DIRECTORY(. SRCS)
#用SRCS指定的源码文件编译出可执行程序ProjTest
ADD_EXECUTABLE(ProjTest ${SRCS})
我个人的习惯是在工程目录下建立一个build 目录,进入到build 目录后执行cmake ..
执行cmake .. 后,cmake 工具会到上一层目录,也就是test_1目录下找CMakeLists.txt 来生成对应的Makefile
这时候再执行make 就会编译出对应的程序,在build 目录下
2、多目录源码编译
有时候我们会在工程里面创建多个目录来存放代码,这样会更方便管理和维护,那么在这种情况下需要怎么写CMakeLists.txt
# 设置工程的名称
PROJECT(ProjTest_2)
# 变量SRCS保存当前目录下所有的源码文件 . 代表当前目录
AUX_SOURCE_DIRECTORY(. SRCS)
# 变量SRCS保存src目录下所有的源码文件
AUX_SOURCE_DIRECTORY(./src SRCS)
#用SRCS指定的源码文件编译出可执行程序ProjTest2
ADD_EXECUTABLE(ProjTest2 ${SRCS})
如上,添加AUX_SOURCE_DIRECTORY(./src SRCS) 这一句就可以了,如果src 目录下还有一个init 目录,也需要编译进来,那么添加AUX_SOURCE_DIRECTORY(./src/init SRCS) 就可以了。
当然还有另外一种做法,就是在src目录再创建一个CMakeLists.txt
# 变量SRCS_C保存当前目录下所有的源码文件 . 代表当前目录
AUX_SOURCE_DIRECTORY(. SRCS_C)
#用SRCS_C指定的源码文件编译出libtest.a
ADD_LIBRARY(test ${SRCS_C})
上面的命令表示把src目录下的代码编译成静态库libtest.a,写成ADD_LIBRARY(test SHARED ${SRCS_C}) 则编译成动态库
# 设置工程的名称
PROJECT(ProjTest_2)
#添加需要编译的子目录
ADD_SUBDIRECTORY(src)
# 变量SRCS保存当前目录下所有的源码文件 . 代表当前目录
AUX_SOURCE_DIRECTORY(. SRCS)
#用SRCS指定的源码文件编译出可执行程序ProjTest2
ADD_EXECUTABLE(ProjTest2 ${SRCS})
#设置目标 所需要的依赖库
TARGET_LINK_LIBRARIES(ProjTest2 test)
父目录下的CMakeLists.txt 则多添加了ADD_SUBDIRECTORY(src),TARGET_LINK_LIBRARIES(ProjTest2 test),前面一句相当于告诉cmake 工具找src目录下的CMakeLists.txt ,如果src 目录下还有代码目录,也可以在该目录下再添加一个CMakeLists.txt 来指示如何编译该目录下的代码。
一样的,先执行cmake .. ,然后再执行make 就可以编译出对应的目标文件了