Cmake例子一二

例子一: 单个源文件 main.c
例子二: 分解成多个 main.c hello.h hello.c
例子三: 先生成一个静态库,链接该库
例子四: 将源文件放置到不同的目录
例子五: 控制生成的程序和库所在的目录
例子六: 使用动态库而不是静态库
例子一
一个经典的C程序,如何用cmake来进行构建程序呢?
//main.c
#include <stdio.h>
int main()
{
    printf("Hello World!/n");
    return 0;
}编写一个 CMakeList.txt 文件(可看做cmake的工程文件):

project(HELLO)
set(SRC_LIST main.c)
add_executable(hello ${SRC_LIST})
然后,建立一个任意目录(比如本目录下创建一个build子目录),在该build目录下调用cmake
•注意:为了简单起见,我们从一开始就采用cmake的 out-of-source 方式来构建(即生成中间产物与源代码分离),并始终坚持这种方法,这也就是此处为什么单独创建一个目录,然后在该目录下执行 cmake 的原因
cmake .. -G"NMake Makefiles"
nmake或者
cmake .. -G"MinGW Makefiles"
make即可生成可执行程序 hello(.exe)

目录结构
+
|
+--- main.c
+--- CMakeList.txt
|
/--+ build/
   |
   +--- hello.execmake
的不太好用哈,使用cmake的过程,本身也就是一个编程的过程,只有多练才行。

我们先看看:前面提到的这些都是什么呢?

CMakeList.txt
第一行 project 不是强制性的,但最好始终都加上。这一行会引入两个变量
•HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR
同时,cmake自动定义了两个等价的变量
•PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR
因为是out-of-source方式构建,所以我们要时刻区分这两个变量对应的目录
可以通过message来输出变量的值
message(${PROJECT_SOURCE_DIR})set 命令用来设置变量
add_exectuable 告诉工程生成一个可执行文件。
add_library 则告诉生成一个库文件。
•注意:CMakeList.txt 文件中,命令名字是不区分大小写的,而参数和变量是大小写相关的。
cmake命令
cmake 命令后跟一个路径(..),用来指出 CMakeList.txt 所在的位置。

由于系统中可能有多套构建环境,我们可以通过-G来制定生成哪种工程文件,通过 cmake -h 可得到详细信息。
要显示执行构建过程中详细的信息(比如为了得到更详细的出错信息),可以在CMakeList.txt内加入:
•SET( CMAKE_VERBOSE_MAKEFILE on )
或者执行make时
•$ make VERBOSE=1
或者
•$ export VERBOSE=1
•$ make
例子二
一个源文件的例子一似乎没什么意思,拆成3个文件再试试看:
•hello.h 头文件
#ifndef DBZHANG_HELLO_
#define DBZHANG_HELLO_
void hello(const char* name);
#endif //DBZHANG_HELLO_•hello.c
#include <stdio.h>
#include "hello.h"
void hello(const char * name)
{
    printf ("Hello %s!/n", name);
}•main.c
#include "hello.h"
int main()
{
    hello("World");
    return 0;
}
•然后准备好CMakeList.txt 文件
project(HELLO)
set(SRC_LIST main.c hello.c)
add_executable(hello ${SRC_LIST})执行cmake的过程同上,目录结构

+
|
+--- main.c
+--- hello.h
+--- hello.c
+--- CMakeList.txt
|
/--+ build/
   |
   +--- hello.exe
例子很简单,没什么可说的。

 

 

posted @ 2015-12-28 19:54  xfei.zhang  阅读(219)  评论(0编辑  收藏  举报