Windows 交叉编译之 make
以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/w8YV_TUb4QwsgChu3AspHg
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 这种。
如果你需要了解其它安装方式,可以关注本公众号,查看该推文《在 Windows 中怎么安装 Make ?》有详细介绍。
首先,网上搜索 make for windows
点击该链接进入页面,然后找到 Complete package, except sources
把安装文件下载到本地,直接双击执行即会开始安装。
安装完成后,还需要配置一下系统变量,否则在调用 make 时系统无法找到该执行文件
详细配置过程可参考上面的推文链接,这里从略。
make 编译
在 Windows 这个过程和 Linux 环境下一样,需要先准备一份 Makefile 文件和其它工程文件(比如源文件)。
这里为演示起见,这里创建源文件 main.c
#include <stdio.h>
int main()
{
printf("hello window cross-compile for linux");
return 0;
}
然后,在工程源文件根目录下创建 Makefile 文件(注意文件名),文件内容可以如下写
output: main.c
gcc main.c -o output
由于生成的目标执行文件是要在 Linux 下运行的,这里采用编译器 gcc。同时,指定输出文件为 output。
由于编译是在 Windows 平台,那么编译器 gcc 也需要有对应的 Windows 平台版本。其一般由芯片原厂提供,安装之后也需要配置系统变量以备系统调用。
最后,在 Makefile 文件所在目录运行命令行,并输入命令 make
>make
gcc main.c -o output
编译结束后,拷贝生成的文件 output 到目标平台(Linux)下运行
$ ./output
hello window cross-compile for linux
当然,makefile 其实内容可以很复杂,以后有机会的话会在公众号后续文章继续讲解。
不过,现如今有了 CMake 可以更方便地管理工程,它会自动生成对应的 makefile 文件。我的很多文章都有介绍过 CMake,其中《一文入门Qt Quick》文内有详细介绍。
Windows 交叉编译之 make的更多相关文章
- ARM-linux的Windows交叉编译环境搭建
交叉编译Arm Linux平台的QT5库 1.准备交叉编译环境 环境说明:Windows10 64位 此过程需要: (1)Qt库开源代码,我使用的是5.13.0版本: (2)Perl语言环境5.12版 ...
- Golang 在 Mac、Linux、Windows 交叉编译
https://blog.csdn.net/panshiqu/article/details/53788067
- 基于Ubuntu交叉编译FFmpeg Windows SDK
写在前面 FFmpeg是一个开源且跨平台的音视频解决方案,集采集.转码.流式化为一身,项目的libavcodec编解码模块和libavformat媒体格式模块,支持非常非常丰富的编解码格式和容器封装格 ...
- Windows下FFmpeg各版本库文件下载
ffmpeg主要是基于linux开发,当然它也支持windows,不过并不支持visual studio系列IDE(因为它使用了大量C99特性,而vs不支持C99). 要想在windows上使用 一可 ...
- Go Windows 环境安装及配置(一)
首先安装windows的包 go1.12.6.windows-amd64.msi cmd 查看下环境变量 go env set GOARCH=amd64 --架构 amd64/arm set GOBI ...
- 2018-2019-2 20165330《网络对抗技术》Exp3 免杀原理与实践
目录 基础问题 相关知识 实验内容 实验步骤 实验过程中遇到的问题 离实战还缺些什么技术或步骤? 实验总结与体会 实验内容 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil- ...
- Golang在windows下交叉编译linux程序
1.下载相关程序. Golang下载:http://www.golangtc.com/download Git下载:http://git-scm.com/download/ TDM-GCC下载:htt ...
- Windows平台交叉编译Arm Linux平台的QT5.7库
1.准备交叉编译环境 环境说明:Windows 7 64位 此过程需要: (1)Qt库开源代码,我使用的是5.7.0版本: (2)Perl语言环境5.12版本以上: (3)Python语言环境 2.7 ...
- Golang 在 Mac、Linux、Windows 下如何交叉编译(转)
原文地址:Golang 在 Mac.Linux.Windows 下如何交叉编译 Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序,最近使用了一下,非常好用,这里备忘一下. Mac 下 ...
- Golang 在 Mac、Linux、Windows 下交叉编译
Golang 支持在一个平台下生成另一个平台可执行程序的交叉编译功能. Mac下编译Linux, Windows平台的64位可执行程序: CGO_ENABLED= GOOS=linux GOARCH= ...
随机推荐
- CopyOnWriteArrayList的使用和优缺点
CopyOnWriteArrayList允许并发读,读操作无锁,性能较高: 而写操作(含删除),比如向容器中添加/删除一个元素,则首先将当前容器复制一份,然后在新副本上执行写操作,结束之后再将原容器的 ...
- live555中ts流详细解析
live555中ts流详细解析 该文档主要是对live555源码下testProgs中testMPEG2TransportStreamer服务器端的详细分析.主要分析ts流实现的总体调用流程.(重新整 ...
- Pyathon If条件测试
if条件测试 # 案例 cars = ['audi','bmw','subaru','toyota'] for car in cars: if car =='bmw': print(car.upper ...
- java封装和关键字
一.封装 封装:告诉我们如何正确设计对象的属性和方法 对象代表什么,就得封装对应的数据,并提供数据对应的行为 封装的好处: 让编程变得很简单,有什么事,找对象,调方法 降低学习成本,可以少学,少记,或 ...
- 2023-03-18:给定一个长度n的数组,每次可以选择一个数x, 让这个数组中所有的x都变成x+1,问你最少的操作次数, 使得这个数组变成一个非降数组。 n <= 3 * 10^5, 0 <= 数值
2023-03-18:给定一个长度n的数组,每次可以选择一个数x, 让这个数组中所有的x都变成x+1,问你最少的操作次数, 使得这个数组变成一个非降数组. n <= 3 * 10^5, 0 &l ...
- 2022-07-14:以下go语言代码输出什么?A:1;B:3;C:4;D:编译错误。 package main import ( “fmt“ ) func main() { a
2022-07-14:以下go语言代码输出什么?A:1:B:3:C:4:D:编译错误. package main import ( "fmt" ) func main() { a ...
- 从前后端的角度分析options预检请求
摘要:options预检请求是干嘛的?options请求一定会在post请求之前发送吗?前端或者后端开发需要手动干预这个预检请求吗?不用文档定义堆砌名词,从前后端角度单独分析,大白话带你了解! 本文分 ...
- deepin系统更新谷歌浏览器chrome的方法
deepin系统更新谷歌浏览器chrome的方法 1 为什么要更新谷歌浏览器谷歌浏览器更新频繁,隔一段时间不更新,打开浏览器时会自动弹出一个提示更新的窗口,有点烦,如果使用python自动处理程序时, ...
- NOIP2021游记
前言: 今年我是以初中生的身份参加的 NOIP,不计奖,不排名,就去试试水. 考得也不好,幸好没计奖. 正文: 早上 7 点: 到LNBS,在旁边吃了早饭,很好吃. 早上 8 点: 校门口照相,然后进 ...
- 一篇文章带你详细了解axios的封装
axios 封装 对请求的封装在实际项目中是十分必要的,它可以让我们统一处理 http 请求.比如做一些拦截,处理一些错误等.本篇文章将详细介绍如何封装 axios 请求,具体实现的功能如下 基本配置 ...