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》文内有详细介绍。

相关推荐
数据智能老司机37 分钟前
自己动手写编程语言——源代码扫描
架构·编程语言·编译原理
数据智能老司机40 分钟前
自己动手写编程语言——编程语言设计
架构·编程语言·编译原理
用户75389755281753 天前
《手写解释器》第7章 表达式求值
编译原理·编译器
无厘头三四十22 天前
现代编译器直接生成机器码的原理
编译原理
猪哥帅过吴彦祖25 天前
从源码到可执行文件:揭秘程序编译与执行的底层魔法
操作系统·编译原理·编译器
poemyang1 个月前
性能优化之母:为什么说“方法内联”是编译器优化中最关键的一步棋?
java虚拟机·编译原理·即时编译器·方法内联
poemyang1 个月前
new出来的对象,不一定在堆上?聊聊Java虚拟机的优化技术:逃逸分析
java虚拟机·编译原理·逃逸分析·即时编译器
前端缘梦1 个月前
解锁webpack核心技能(三):从源代码到打包产物编译过程的原理指南
webpack·编译原理·前端工程化
poemyang1 个月前
解锁硬件潜能:Java向量化计算,性能飙升W倍!
java虚拟机·编译原理·jit·向量化计算·smid
poemyang1 个月前
Java编译器优化秘籍:字节码背后的IR魔法与常见技巧
java虚拟机·编译原理·ir·即时编译器