本文由简书站上的多篇博客经我验证后修改了错误 + 细化步骤 + 严谨地审查,后发表。
参考文章链接1:https://www.jianshu.com/p/8df5b2aba316
参考文章链接2:https://www.jianshu.com/p/6df3857462cd
CMake中文手册:http://www.cnblogs.com/coderfenghc/tag/cmake/
参看下面的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的源文件
mkdir hello #工程目录
cd hello
mkdir src # 存放源代码的目录
mkdir build # 存放编译中间代码和目标代码的目录
#include
int main(int argc, char **argv)
{
printf("hello world\n");
return 0;
}
cmake_minimum_required(VERSION 3.5)
#指定项目名
project(hello)
#指定子目录
add_subdirectory(src)
add_subdirectory(source_dir [binary_dir]
[EXCLUDE_FROM_ALL])
这条命令的作用是为构建添加一个子路径。
aux_source_directory(. SRC_LIST)
add_executable(hello ${SRC_LIST})
aux_source_directory( )
查找在某个路径下的所有源文件。
该命令会把参数 中所有的源文件名称赋值给参数 。
add_executable( [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)
引入一个名为的可执行目标,该目标会由调用该命令时在源文件列表中指定的源文件来构建。
.
├── build
├── CMakeLists.txt
└── src
├── CMakeLists.txt
└── main.c
# 1.进入build 目录
cd build
# 2.执行命令cmake ..创建Makefile
cmake ..
# 3.执行命令make编译工程
make
# 4.运行可执行文件
./src/hello
# 输出
hello world
4.在build的子目录src生成了执行文件
另起一个新的工程目录
mkdir hello2 # 工程目录
cd hello2
mkdir src # 存放源码目录
mkdir build # 存放编译产生的中间文件
cd src
mkdir hello # 存放hello 模块
mkdir world # 存放world 模块
进入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)
添加一个名为的库文件,该库文件将会根据调用的命令里列出的源文件来创建。
进入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})
进入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)。
如果一个库名字与工程中的另外一个目标相匹配,一个依赖关系会自动添加到构建系统中来,这样就可以在链接目标之前,保证正在被链接的库是最新的。
cmake_minimum_required(VERSION 3.5)
project(hello_prj)
add_subdirectory(src)
.
├── build
├── CMakeLists.txt
└── src
├── CMakeLists.txt
├── main.c
├── hello
│ ├── CMakeLists.txt
│ ├── hello.c
│ └── hello.h
└── world
├── CMakeLists.txt
├── world.c
└── world.h
# 1.进入build 目录
cd build
# 2.执行命令cmake ..创建Makefile
cmake ..
# 3.执行命令make编译工程
make
# 4.运行可执行文件
./src/hello_prj
# 输出
hello world