CMake快速上手教程

教程框架

        • 起点(Step 1)
        • 1. 编译单目录工程
          • 1.创建工程文件夹
          • 2.进入src目录,编写一个main.c文件
          • 3.编写工程顶层目录的CMakeLists.txt
          • 4.编写子目录src的CMakeLists.txt
          • 5.最后的工程目录结构
          • 6.编译工程
        • 2. 编译多目录工程
          • 1.创建工程目录
          • 2.编写hello模块
          • 3.编写world模块
          • 4.编写主模块
          • 5.编写顶层目录的CMakeLists.txt文件
          • 6.最后的工程目录结构
          • 7.编译工程

本文由简书站上的多篇博客经我验证后修改了错误 + 细化步骤 + 严谨地审查,后发表。
参考文章链接1:https://www.jianshu.com/p/8df5b2aba316
参考文章链接2:https://www.jianshu.com/p/6df3857462cd
CMake中文手册:http://www.cnblogs.com/coderfenghc/tag/cmake/

起点(Step 1)

参看下面的CMakeLists.txt文件,最简单的一个工程需要有一个这样的cmake文件,一共就这么两行

cmake_minimum_required(VERSION 3.5)
project (hello) 
add_executable (hello hello.c)

注意到这里都是用的小写的命令,在cmake文件里面大小写不严格区分,都可以用。
add_executable添加一个可执行的目标到工程里面

add_executable( [WIN32] [MACOSX_BUNDLE]
               [EXCLUDE_FROM_ALL]
               source1 [source2 ...])
* name: 工程所要构建的目标名称
* WIN32/..: 目标app运行的平台
* source1:构建目标App的源文件               
  1. []:内的内容意思是:可写可不写
  2. {}:那就必须要在{}内给出的选择里选一个。
  3. <>:表示必选
1. 编译单目录工程
1.创建工程文件夹
mkdir hello #工程目录
cd hello
mkdir src   # 存放源代码的目录
mkdir build # 存放编译中间代码和目标代码的目录
2.进入src目录,编写一个main.c文件
#include 

int main(int argc, char **argv)
{
    printf("hello world\n");
    return 0;
}
3.编写工程顶层目录的CMakeLists.txt
cmake_minimum_required(VERSION 3.5)

#指定项目名
project(hello)

#指定子目录
add_subdirectory(src)
add_subdirectory(source_dir [binary_dir] 
                   [EXCLUDE_FROM_ALL])
这条命令的作用是为构建添加一个子路径。
4.编写子目录src的CMakeLists.txt
aux_source_directory(. SRC_LIST)

add_executable(hello ${SRC_LIST})
aux_source_directory( )
查找在某个路径下的所有源文件。
该命令会把参数  中所有的源文件名称赋值给参数  。

add_executable( [WIN32] [MACOSX_BUNDLE]
                 [EXCLUDE_FROM_ALL]
                 source1 source2 ... sourceN)
引入一个名为的可执行目标,该目标会由调用该命令时在源文件列表中指定的源文件来构建。
5.最后的工程目录结构
.
├── build
├── CMakeLists.txt
└── src
    ├── CMakeLists.txt
    └── main.c
6.编译工程
# 1.进入build 目录
cd build
# 2.执行命令cmake ..创建Makefile
cmake ..
# 3.执行命令make编译工程
make
# 4.运行可执行文件
./src/hello
# 输出
hello world

4.在build的子目录src生成了执行文件

2. 编译多目录工程

另起一个新的工程目录

1.创建工程目录
mkdir hello2 # 工程目录
cd hello2
mkdir src   # 存放源码目录
mkdir build # 存放编译产生的中间文件
cd src      
mkdir hello # 存放hello 模块
mkdir world # 存放world 模块
2.编写hello模块

进入hello目录
编写hello.h文件

#ifndef  __HELLO_H__
#define  __HELLO_H__

void Hello_Print(void);

#endif

编写hello.c文件

#include "hello.h"

#include 

void Hello_Print(void)
{
    printf("hello ");
}

编写CMakeLists.txt 文件

aux_source_directory(. DIR_HELLO_SRC)

add_library(hello_lib ${DIR_HELLO_SRC})
add_library( [STATIC | SHARED | MODULE]
              [EXCLUDE_FROM_ALL]
              source1 source2 ... sourceN)
添加一个名为的库文件,该库文件将会根据调用的命令里列出的源文件来创建。              
3.编写world模块

进入world目录
编写world.h文件

#ifndef  __WORLD_H__
#define  __WORLD_H__

void World_Print(void);

#endif

编写world.c文件

#include "world.h"

#include 

void World_Print(void)
{
    printf("world\n");
}

编写CMakeLists.txt 文件

aux_source_directory(. DIR_WORLD_SRC)

add_library(world_lib ${DIR_WORLD_SRC})
4.编写主模块

进入src目录
编写main.c 文件

#include "hello.h"
#include "world.h"

int main(int argc, char **argv)
{
    Hello_Print();
    World_Print();

    return 0
}

编写CMakeLists.txt 文件

aux_source_directory(. DIR_SRC)
# 添加子目录
add_subdirectory(hello)
add_subdirectory(world)

# 添加路径到头文件的搜索路径
# CMAKE_CURRENT_SOURCE_DIR(当前CMakeLists.txt文件的路径)
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/hello")
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/world")

# 执行文件
add_executable(hello_prj ${DIR_SRC})
target_link_libraries(hello_prj hello_lib world_lib)
include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
将给定的路径添加到编译器搜索包含文件(.h文件)的路径列表中。

cmake会自动定义几个变量
* ${CMAKE_CURRENT_SOURCE_DIR} : 指向正在被处理的源码目录的路径。 
* ${PROJECT_SOURCE_DIR}: 当前工程顶层的目录
* ${PROJECT_BINARY_DIR}: 当前工程的构建目录(本例中新建的build目录)


target_link_libraries( [item1 [item2 [...]]] [[debug|optimized|general] ] ...)
为给定的目标设置连接时使用的库或者标志(flags)。
如果一个库名字与工程中的另外一个目标相匹配,一个依赖关系会自动添加到构建系统中来,这样就可以在链接目标之前,保证正在被链接的库是最新的。
5.编写顶层目录的CMakeLists.txt文件
cmake_minimum_required(VERSION 3.5)

project(hello_prj)

add_subdirectory(src)
6.最后的工程目录结构
.
├── build
├── CMakeLists.txt
└── src
    ├── CMakeLists.txt
    ├── main.c
    ├── hello
    │   ├── CMakeLists.txt
    │   ├── hello.c
    │   └── hello.h
    └── world
        ├── CMakeLists.txt
        ├── world.c
        └── world.h
7.编译工程
# 1.进入build 目录
cd build
# 2.执行命令cmake ..创建Makefile
cmake ..
# 3.执行命令make编译工程
make
# 4.运行可执行文件
./src/hello_prj
# 输出
hello world

你可能感兴趣的:(linux,CMake)