cmake
cmake:开源库跨平台编译,测试,打包工具。主要是通过使用平台独立配置文件来产生配置文件以及生成基于平台的makefile来控制软件的编译过程。
cmake可以:
1. 能够自动寻找软件所需要的程序,库文件,头文件等。这些文件可能因为平台的不同而不同。
2. 能够独立于源代码文件夹,在其他地方生成build文件。
3. 能够生成复杂,可控的版本文件。
4. 有选择的控制编译所需要的文件。
5. 方便的在共享库和静态库间切换。
6. 依据平台生成makefile。
基础的cmake用法以及语法
要使用cmake非常简单,只要新建若干个CMakeLists文件就能控制编译过程。CMakeLists文件需要包含对于如何构建该项目的描述。这些语句成为一系列的指令(command),有着如下的形式:
command (args...)
command
是指令的名称,而args
则是由白字符分割的一串参数。cmake是大小写不敏感的。
cmake 支持简单变量,变量可以通过使用像${VAR}
的语法来引用。当然也可以为一个变量设置多个参数成为一个参数组,比如
set(Foo a b c)
就将Foo
这个变量设置为a b c
,这样就能将命令写成如下形式:
command("${Foo}")
等同于 command("a b c")
。
系统变量可以通过这种形式访问到。
Hello World cmake 0.1版
#include <stdio.h>
int main(int argc, char **argv)
{
printf("hello world!\n");
return 0;
}
要生成生成这么简单的一个可执行文件只需要在CMakeLists.txt中加上两句
project(hello)
add_executable(hello hello.c)
然后在当前目录下
$ cmake .
$ make
$ ./hello
即可看到效果了。
project
命令指明了工作空间以及随后add_executable
命令将可执行目标添加进构建过程。
Hello World cmake 0.2版
这一版本中,我们将hello world程序打散,拆成多个文件。
hello.c
#include <stdio.h>
int main(int argc, char** argv)
{
say_hello();
return 0;
}
func.c
void say_hello()
{
printf("hello world!\n");
}
这一次我们发现say_hello
函数将打印出hello world,而该函数则在独立的func.c
文件中存在
这次我们CMakeLists.txt
中变成了这样
project(hello)
add_executable(hello hello.c func.c)
Hello World cmake 0.3版
在本版的基础上,我们将加入跨平台支持。
hello.c
#include <stdio.h>
int main(int argc, char **argv)
{
hello_all();
say_hello();
return 0;
}
hello_all
为全平台支持函数,而say_hello
依据平台不同而有不同表现。
func_all.c 全平台支持实现
void hello_all(){
printf("hello world,my friends.\n");
}
func_app.c/func_uni.c/func_win.c
void say_hello(){
printf("hello world,apple\n");
//printf("hello world,linux\n"); uni.c
//printf("hello world,windows\n"); win.c
}
最后我们的CMakeLists.txt
文件则需要一点点的逻辑判断,判断哪些是文件是需要被编译进执行程序的。