Windows 交叉编译之 make

以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」mp.weixin.qq.com/s/w8YV_TUb4...

Make 是什么

Make 本来是一个在 linux 环境下用于控制程序和相关文件生成的工具。Make 工作过程需要辅以 makefile 文件指导生成过程和列出需要的原材料,比如源文件、依赖库等。有了 makefile 文件,Make 就可以根据输入文件的变更来更新对应的输出程序文件,而不需要完全重新编译输出,提高了编译效率。Make 通过比较目标输出文件和输入文件的时间来决定是否需要更新。

另外 Make 不限制源文件的编写语言。

Make 不仅仅用于生成程序,还用于打包、安装、卸载软件包等。这可以避免系统维护人员了解不必要的细节和在繁琐的操作中浪费时间。是的,细节都在 makefile 文件中,makefile 文件可以指定依赖包的安装卸载先后顺序,这样使得执行过程是完全自动化的。

虽然编写 makefile 文件是费时的,但是如果你的执行过程足够频繁,那么就很值得投入时间编写好 makefile 文件。

如果你是一枚技术狂热者,那么 Make 是你不可多得的工具。

问题来了,如果需要在 Windows 平台交叉编译适用于 Linux 的程序文件,可否也使用 Make ?

当然可以,下面继续看。

安装 make

Windows 平台并没有自带 make,所以需要我们自己配置环境。

配置 make 环境第一步就是下载安装包。下载安装的方式还有很多,比如 GnuWin32.make、Winget、Chocolatey、WSL、MinGW 等等,这里只是介绍使用 GnuWin32.make 这种。

如果你需要了解其它安装方式,可以查阅我的其它文章有详细介绍。

首先,网上搜索 make for windows

点击该链接进入页面,然后找到 Complete package, except sources

把安装文件下载到本地,直接双击执行即会开始安装。

安装完成后,还需要配置一下系统变量,否则在调用 make 时系统无法找到该执行文件

详细配置过程可参考上面的推文链接,这里从略。

make 编译

在 Windows 这个过程和 Linux 环境下一样,需要先准备一份 Makefile 文件和其它工程文件(比如源文件)。

这里为演示起见,先创建源文件 main.c

arduino 复制代码
#include <stdio.h>

int main()
{
    printf("hello window cross-compile for linux");
    return 0;
}

然后,在工程源文件根目录下创建 Makefile 文件(注意文件名),文件内容可以如下写

lua 复制代码
output: main.c
	gcc main.c -o output

由于生成的目标执行文件是要在 Linux 下运行的,这里采用编译器 gcc。同时,指定输出文件为 output。

由于编译是在 Windows 平台,那么编译器 gcc 也需要有对应的 Windows 平台版本。其一般由芯片原厂提供,安装之后也需要配置系统环境变量以备系统调用。

最后,在 Makefile 文件所在目录运行命令行,并输入命令 make

css 复制代码
>make
gcc main.c -o output

编译结束后,拷贝生成的文件 output 到目标平台(Linux)下运行

shell 复制代码
$ ./output 
hello window cross-compile for linux

当然,makefile 其实内容可以很复杂,以后有机会的话会在公众号后续文章继续讲解。

不过,现如今有了 CMake 可以更方便地管理工程,它会自动生成对应的 makefile 文件,避免了繁杂的编写过程。我的很多文章都有介绍过 CMake,比如《一文入门Qt Quick》文内有详细介绍。

相关推荐
Trouvaille ~16 天前
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
c++·c++20·编译原理·编译器·类和对象·rvo·nrvo
无名之逆1 个月前
B树和B+树
javascript·数据结构·b树·算法·编译原理·期末速成
嚯呀怪怪怪1 个月前
从零基础学Go(九)——Go的Goroutine
golang·线程·多线程·并发·编译原理·协程·gorountine
Beginner x_u3 个月前
编译原理 第二章下: 推导,规约,句型句子,语言,文法分类,二义性
编译原理·语言·推导·文法
codists3 个月前
《编译原理》阅读笔记:p19-p24
编译原理
Beginner x_u3 个月前
编译原理 第一章: 编译概述 重点总结(翻译程序的过程,解释程序,编译程序的结构)
编译原理·解释程序·翻译程序·编译概述
Beginner x_u3 个月前
编译原理 第三章上 :词法分析 状态图的画法与检验
编译原理·词法分析·状态图
codists3 个月前
《编译原理》阅读笔记:p18
编译原理
岁岁岁平安3 个月前
编译原理大题自解(活前缀DFA、LR(0)分析表)
笔记·编译原理
不规则前端5 个月前
一文学会编译原理,妈妈再也不用担心我失业了
程序员·编程语言·编译原理