前言
笔者在做嵌入式mcu编程的时候,有时候想要验证一下部分代码的功能,需要先编译成bin文件,然后烧录到mcu内执行。每次编译烧录运行耗时较久。于是想到是不是可以在电脑上配置一个c的编译环境,来验证一些与硬件不相干的代码。验证好后,直接放到keil编译,烧录到mcu。这样直接在电脑上验证可以节省不少时间,提高效率。
由于只是简单的验证部分代码,又不是要开发c工程,能搞一个轻量化的编译环境是比较好的。所以windows上实用率较高的vs studio,Code::Blocks这些集成编译环境首先就pass掉了。于是就想到是不是需要可以把linux上的,gcc make这些好用的编译方法移植到windows上呢?经过查找资料发现,使用wingw + cMake 完全能够满足需求。有了cMake就不需要自己编写Makefile了(Makefile语法学过多次,还是不能熟练应用)。本篇做一个简单的配置教程,以及一个常见的多目录多文件的编译实例。
mingw安装
Minimalist GNU for Windows- windows上最简洁的GNU编译器。其网址如下:
https://sourceforge.net/projects/mingw-w64/files/
下载图中的一个就行了,但是官网下载速度非常慢,这里给出笔者下载好的文件,
解压后如下:
将解压后的mingw64文件夹拷贝到想要放置的目录。这里直接是安装好的文件,直接用就行了
笔者放到了D:\Program Files\mingw64
然后添加环境变量
添加好后,在桌面上shift+右键 打开powershell。输入gcc --version
如上,则mingw安装完成
CMake安装
CMake官网下载地址:https://cmake.org/download/
官网下载速度也比较慢,建议下载Windows x64 Installer,这个只有20多M,下载的快些。这里给出笔者下载好的。
下载完成后,点击安装即可。
安装好后,在桌面打开powershell,输入cmake --verson
如上则安装成功
编译构建
直接gcc编译单个文件
对于只有一个文件的程序,直接用gcc编译更快。示例如下:
在桌面上新建一个test.c文件,内容如下:
#include <stdio.h>
int main(void)
{
printf(" hello gcc \r\n");
}
编译及输出如下:
实际在验证的时候基本不可能是这么简单的一个.c文件,肯定是包含多个目录的多个.c和.h文件。这直接在终端用gcc编译肯定不靠谱。所以需要编译构建系统CMake来完成文件的链接等等工作。
CMake构建系统
CMake是一个编译构建系统,可以通过简单的配置,来实现编译文件的链接。cmake编译后实际生成的是makefile文件,然后通过make命令来进行最终编译。其流程如下:
新建CMakeLists.txt -> CMake 构建 -> 生成Makefile -> make 进行编译->运行生成的.exe文件
这里新建一个拥有两个子文件夹的项目,其目录结构如下:
注意,每一级目录都需要有CMakeLists.txt文件。功能很简单,main函数调用 age函数和name函数。这两个函数分别打印出名字,和年龄。这基本上包含了一个最小的多文件目录的项目。
age目录
** age_1.c**
#include <stdio.h>
#include "age_1.h"
void age(void)
{
printf("age is 18\r\n");
}
** age_1.h**
#ifndef __AGE_1_H
#define __AGE_1_H
void age(void);
#endif
** CMakeLists.txt**
aux_source_directory(. AGE_SRC)
add_library(lib_age ${AGE_SRC})
name目录
name.c
#include <stdio.h>
#include "name_1.h"
void name(void )
{
printf("name is jose\r\n");
}
** name.h**
#ifndef __NAME_1_H__
#define __NAME_1_H__
void name(void );
#endif
** CMakeLists.txt**
aux_source_directory(. NAME_SRC)
add_library(lib_name ${NAME_SRC})
根目录
** main.c**
#include <stdio.h>
#include "age_1.h"
#include "name_1.h"
int main(void)
{
name();
age();
printf("done\r\n");
}
** CMakeLists.txt**
cmake_minimum_required (VERSION 3.0) #指定最低cmake版本
project(MAIN) #定义项目名称可以不加
aux_source_directory(. ALL_SRC) #添加当前目录的源文件
include_directories(${PROJECT_SOURCE_DIR}/age ./name ) #添加头文件路径
# target_include_directories(simple PUBLIC "./nanopb")
add_subdirectory(name) #添加子目录源文件
add_subdirectory(age) #添加子目录源文件
add_executable(main ${ALL_SRC} ) #指定编译输出的文件名称
target_link_libraries(main lib_name lib_age) #链接子目录的库,一定要有
编译运行
在根目录执行
cmake构建命令
cmake -G “MinGW Makefiles” .
编译命令
mingw32-make.exe
最终运行结果如下:
如果说不需要新增加文件目录,CMakeLists.txt基本不用修改。添加.c和.h文件后,只需要运行上述两条命令即可运行。
下载
本文所有文件下载:
工程文件
https://download.csdn.net/download/sinat_36568888/87458583
mingw
https://download.csdn.net/download/sinat_36568888/87458585
cmake
https://download.csdn.net/download/sinat_36568888/87458578