前言
不会python的我玩树莓派pico充满了艰难,只能用C来玩pico,在Windows上搭建环境一直不成功,在Ubuntu上好不容易把环境搭建成功,发现竟然还要会cmake,简直丧心病狂呀!!!
只能一边流着没有技术的眼泪,一边学习cmake。
本文在巨人的肩膀上,边学习,边记录。
demo的Github地址:https://github.com/shiliu-yang/CMake_study
正文
下面的例程均在Ubuntu上使用C语言进行实验的,cmake版本3.16。
demo1
开始创建一个叫demo1
的文件夹,在demo1
中创建一个main.c
和CMakeLists.txt
。这个CMakeLists.txt
就是现在的痛苦来源文件。
文件结构:
├── CMakeLists.txt
└── main.c
main.c
文件内容:
#include <stdio.h>
int main()
{
printf("Hello, this is demo1.\n");
return 0;
}
CMakeLists.txt
文件内容:
# 对cmake的最低版本要求
cmake_minimum_required(VERSION 3.16)
# cmake project 名字为 DEMO1
project(DEMO1)
# 设置变量
set(SRC_LIST main.c)
# 生成编译产物的名字为demo1
add_executable(demo1 ${SRC_LIST})
然后再demo1路径下执行:
$ cmake .
$ make #编译
$ ./demo1 #执行可执行文件
执行结果如下:
demo2
在demo1
中会发现他的编译生成的文件和我们代码、脚本文件在一起,就是下面的这个样子。
emmm…好像看起来他的乱不是那么直观,下面这个样子就更直观了
那么如何把编译产物和编译过程中的中间文件分离开来呢?
首先我们把demo1
文件夹里的CMakeLists.txt
、main.c
两个文件夹复制到我们的demo2
中,然后新建一个叫build
的文件夹,这时他的文件结构是这个样子的:
├── build
├── CMakeLists.txt
└── main.c
1 directory, 2 files
然后我们执行下面的命令:
$ cd build
$ cmake ..
$ make
先进入build
文件夹中,然后使用cmake ..
命令开始生成Makefile文件,依然在build
文件夹中make
命令开始编译,编译后的文件结构如下:
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ ├── cmake_install.cmake
│ ├── demo2
│ └── Makefile
├── CMakeLists.txt
└── main.c
2 directories, 6 files
编译产物和编译过程中的中间文件全部都在了build文件夹中(我这里可执行文件叫demo2,因为我在脚本中做了修改),舒服许多。
demo3
正常来说一个工程是有多个文件的,而且一个文件太寂寞,他需要伙伴,顺手把build
文件夹也给建了,他的文件结构就变成了这样:
.
├── build
├── CMakeLists.txt
├── func1.c
├── func1.h
├── func2.c
├── func2.h
└── main.c
1 directory, 6 files
main.c
文件内容:
#include <stdio.h>
#include "func1.h"
#include "func2.h"
int main()
{
printf("This is demo3.\n");
func1();
func2();
return 0;
}
func1.c
文件内容为:
#include <stdio.h>
void func1(void)
{
printf("func1\n");
}
func1.h
文件内容为:
#ifndef __FUNC1_H__
#define __FUNC1_H__
void func1(void);
#endif /* __FUNC1_H__ */
func2.c
、func2.h
,就把文件名,函数名,打印输出内容什么的从1改成了2,这里不再展示。
CMakeLists.txt
内容:
# 对cmake的最低版本要求
cmake_minimum_required(VERSION 3.16)
# cmake project 名字为 DEMO3
project(DEMO3)
# 设置变量
set(SRC_LIST main.c func1.c func2.c)
# 生成编译产物的名字为demo3
add_executable(demo3 ${SRC_LIST})
因为我们生成可执行文件的时候需要用到func1.c
和func2.c
两个文件,这里就把他也放到变量SRC_LIST
里面。
我们还可以用message
用来在cmake中打印信息,辅助Debug。比如这样:
# 对cmake的最低版本要求
cmake_minimum_required(VERSION 3.16)
# cmake project 名字为 DEMO3
project(DEMO3)
# 设置变量
set(SRC_LIST main.c func1.c func2.c)
message(${SRC_LIST})
# 生成编译产物的名字为demo3
add_executable(demo3 ${SRC_LIST})
打印的输出信息为:
一篇只写3个demo,省的太长看不下去