[allmake] -- 交叉编译原来如此简单
原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。:http://www.cnblogs.com/johnd/p/5060530.html
作者:John Deng
前言:
做嵌入式开发的攻城狮朋友们,也许你要做个应用,也许你要做驱动,也许你要移植第三方库或应用,交叉编译是少不了的如。如果你是菜鸟,从不会写makefile,正好这里介绍一款开发工具,解决你头疼的问题;如果你是大咖,它也是你的得力助手,让你专注你要做的业务,不必去写冗长的makefile,它就是 allmake。
allmake是一跨平台的开发工具,它建立在make之上,非常容易使用。你可以不需要写makefile,allmake会代你操劳,你只需要把你的源代码放到生成好的src目录下面,支持c/c++/asm混合编译,你无需做额外的设置,只需设置你的依赖关系就行了。
allmake最大的特点是简单易用,跨平台,同一套c/c++代码使用同一套配置,将不同的编译器放置toolchain下面即可。
allmake也非常方便编译第三方代码,通常我们说的移植,很多文章洋洋洒洒几千字的教程,allmake只需要简简单单的三行命令。
安装环境:
Windows:需要安装cygwin或者minsys,我安装的是minsys2环境,安装gcc或者下载i686-w64-mingw32 解压至allmake/toolchain下面。
Linux:任何Linux发行版,我使用的是ubuntu 14.04。
Mac:现安装homebrew,然后在命令行下安装gcc,brew install gcc make automake autoconf
安装方法:
git clone https://github.com/allmake/allmake.git
cd allmake
sudo ./bin/allmake -i
开始使用:
按照以上步骤安装完毕重启电脑后就可以在任何目录下开发c/c++的项目了,比如以ubuntu为例,在$HOME下面创建你的工作目录~/workspace。
* 首先我们来看如何从零创建一个c/c++的项目
mkdir -p ~/workspace/demo
cd ~/workspace/demo
allmake add plat=x86_64-linux (只需执行一次,添加好平台相关配置以后就只用运行下面一行命令就可以了)
allmake clean all release bin
其中 add表示添加配置,plat表示平台platform的缩写,x86_64-linux是ubuntu的平台x86_64-linux-gnu的名称关键字。你查看安装目录allmake/toolchain/下面有一个目录叫x86_64-linux-gnu,代表我们要寻找的编译器是x86_64-linux-gnu-gcc,如果里面是个空目录,那allmake会使用系统不带前缀的gcc作为编译器,
allmake后带了install选项后,所生成的输出文件如头文件、共享库或者可执行二进制文件会安装到allmake/platform/arm-brcm-linux-gnueabi下面,以后你在使用这个库的时候,直接引用头文件就是这样的格式:#include <projectname/headerfile.h>, 以引用demo下面的version.h为例就是 #include <demo/version.h>,而链接依赖就是在添加你的平台时候加入相关选项就是了,如 allmake add plat=x86 COMMON_LIBS='-ldemo', 表示这个项目要依赖libdemo.so
。
如果你把 plat=x86_64-linux 换成 plat=brcm,那么就会配置成arm-brcm-linux-gnueabi的平台,brcm是编译器arm-brcm-linux-gnueabi的一个关键字。
好了,就是这么简单,运行以上两行allmake命令行,就可以生成二进制可执行文件,我们来运行一下
./build/x86_64-linux-gnu/obj/demo
屏幕输出:
demo V1.0.0.151212
你可以用 allmake -h 查看使用方法和各个选项的含义,如option有bin表示输出目标格式是个可执行的二进制文件,否则为共享库;install表示allmake会安装输出目标到allmake安装目录中的platform目录下面。
* 跨平台编译第三方源代码
一般来说,第三方库都写好了makefile或者configure,allmake做的就是基于现有做好的配置来做更简单的配置,以方便跨平台的移植工作。
我们使用得最多的就是为arm linux平台移植的时候,下面以编译器arm-brcm-linux-gnueabi 为例讲解我们经常要用的的一些第三方库的移植方法,使用allmake也是非常的简单,基本上也就三个命令行搞定。
编译第三方库和编译自己的项目使用基本一样的命令,只是配置稍有不同,其中options是指对于使用automake的项目我们一般会这样去配置: ./configure --prefix=/usr/local --host=arm-brcm-linux-gnueabi--enable-feature1 --with-libx 那你会问,你的allmake没有什么优势啊,看起来都差不多,其实这里面有学问的,你看我们无须值得--host和--prefix,取而代之的是用 plat=编译器的关键字,简单而方便,allmake会自动的寻找你放置在
allmake/toolchain/下的编译器,而这个配置allmake会一直记住的,以后更新代码只需要重新运行 allmake configure和allmake clean all install就可以了,allmake后带了install选项后,所生成的共享库或者可执行二进制文件会安装到allmake/platform/arm-brcm-linux-gnueabi下面。
而--exports表示要配置指定编译器 CC=arm-brcm-linux-gnueabi-gcc,AR=
arm-brcm-linux-gnueabi-ar,这根据不同的项目要求而定,大部分automake的项目都需要这个配置,只有一些写的比较简单 makefile会有这个要求。
allmake add plat=the-keyword-of-compiler-folder-name-under-allmake-toolchain options='--enable-feature1 --with-libx' --exports='cc ar'
allmake configure
allmake clean all install
1. 以移植zlib到arm平台为例,首先添加你要的平台配置,和上面讲的平台配置一样,只需指定关键字就可以了,
allmake add plat=brcm exports='cc ar' cwd
allmake configure
allmake clean all install
总结:
allmake我通过十几年c/c++的使用经验所浓缩出来的一些精华,它更重要的是一种编程思想,注重软件的模块化,跨平台,我可以很简单的开启一个新的项目,也许就是一个独立的模块,它可以用在不同的应用软件上面,而应用也很方便的添加这个依赖。
allmake本身是一个开源的跨平台开发工具,具有一定的约定俗成规则,方便建立和管理你的项目的工具,你可以到github下载并通过简单的帮助文档就可以实现很强大的功能,这片文章就先介绍到这里,如果各位有需要,后续我会再写更详细的教程。
如果你在其他转载站点看到这篇文章,也许没有及时更新,请访问http://www.cnblogs.com/johnd/p/5060530.html了解最新动态。
想了解更多详情,请访问 https://github.com/allmake/allmake,如果你觉得allmake对你有帮助,请向你的朋友推广,让更多的人可以用上,你也可以github上面fork allmake。
[allmake] -- 交叉编译原来如此简单的更多相关文章
- 激活Windows 8.1 RTM原来如此简单
日前,Windows 8.1 RTM各种版本已经在坊间泄露开来,许多迫不及待的用户也开始跃跃欲试,但可能有人会疑惑,Windows 8.1RTM该如何激活?其实,它远比你想象的要简单. 实际上,Win ...
- 华为云软件开发云:容器DevOps,原来如此简单!
当开发团队把代码提交到 Git 应用仓库的那一刻,他们心里在想什么? 祈祷没有bug?渴望回家补觉?产品经理Go Die? 对,也不对.因为这只是最终发布万里长征的一小步,接下来要面对测试环境.生产环 ...
- 【Spring】Spring的定时任务注解@Scheduled原来如此简单
1 简介 定时任务的实现非常多,JDK的Timer.Spring提供的轻量级的Scheduled Task.QuartZ和Linux Cron等,还有一些分布式的任务调度框架.本文主要介绍Schedu ...
- git原理,git命令使用详解,github使用 --有此图文并茂原来如此简单
一.Git分布式控制系统原理:git有三个区,被管理的代码或文件是从:工作区-->暂存区-->本地版本库. 二.GitHub创建线上仓库GitHub是一个面向开源及私有软件项目的托管平台, ...
- JS防抖和节流:原来如此简单
一.函数防抖 前端开发工作中,我们经常在一个事件发生后执行某个操作,比如鼠标移动时打印一些东西: window.addEventListener("mousemove", ()=& ...
- K8S原来如此简单(七)存储
emptyDir临时卷 有些应用程序需要额外的存储,但并不关心数据在重启后仍然可用. 例如,缓存服务经常受限于内存大小,将不常用的数据转移到比内存慢.但对总体性能的影响很小的存储中. 再例如,有些应用 ...
- 【基础知识】Flex-弹性布局原来如此简单!!
简言 布局的传统解决方案是基于盒状模型,依赖 display + position + float 方式来实现,灵活性较差.2009年,W3C提出了一种新的方案-Flex,Flex是Flexible ...
- K8S原来如此简单(三)Pod+Deployment
上篇我们已经安装好k8s1.23集群,现在我们开始使用k8s部署我们的项目 Pod Pod 是一组容器集合,是可以在 Kubernetes 中创建和管理的.最小的可部署的计算单元.这些容器共享存储.网 ...
- K8S原来如此简单(四)Service+Ingress
上一篇我们通过deployment实现了pod的横向扩展,但是仍然不能负载,也不能对外提供服务,现在我们来看看如何通过k8s实现负载与外网访问 Service service为一组pod提供一个统一的 ...
随机推荐
- 重新编译Nginx指导手册【修复静态编译Openssl的Nginx漏洞 】(转)
1. 概述 当前爆出了Openssl漏洞,会泄露隐私信息,涉及的机器较多,环境迥异,导致修复方案都有所不同.不少服务器使用的Nginx,是静态编译opensssl,直接将openssl编译到ng ...
- liunx 安装工具总结
1 下载相关文件,比如hadoop 2 解压文件 tar -zxcf xxx.tar.gz 3 mv xxx 到指定目录:通常安装到/usr/local 或者自己建个目录 /usr/develo ...
- 2015 Astar Contest - Round 3 题解
1001 数长方形 题目大意 平面内有N条平行于坐标轴的线段,且不会在端点处相交 问共形成多少个矩形 算法思路 枚举4条线段的全部组合.分别作为矩形四条边.推断是否合法 时间复杂度: O(N4) 代码 ...
- 50道JAVA基础编程练习题 - 题目
50道JAVA基础编程练习题[1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? [2]题目:判断 ...
- 之前博客中的代码都放到github上
之前一直把代码托管在taocode上,现在已经不能用了,所以把代码整理了一下,统一都放在gibhub上了. LALR(1)语法分析生成器:https://github.com/kiven-li/xby ...
- 实现RTSP网站微信直播方案EasyNVR(linux版)部署问题之:ERR_CONTENT_LENGTH_MISMATCH
发现问题: 想要优化一下EasyNVR相关功能,内部测试软件,于是在linux系统中部署了一台EasyNVR.当部署好,运行起来发现问题: EasyNVR的配置页面数据出不来. 分析问题: 基于是we ...
- Java for LeetCode 137 Single Number II
Given an array of integers, every element appears three times except for one. Find that single one. ...
- Linux下/usr/bin/python被删除的后果
可能部分的人使用linux都有直接root登陆的习惯,这有很大的便利性,因为很多的命令不需要使用sudo请求root权限.但是使用root权限,所有的命令都会立即被执行,即使这个命令是对系统有害处的. ...
- PermissionError: [Errno 13] Permission denied:
在ubuntu系统下使用pip 命令安装包时,出现以下类似错误提示: PermissionError: [Errno 13] Permission denied: '/usr/local/lib/py ...
- Wannafly挑战赛12 B T95要减肥 【贪心】
链接:https://www.nowcoder.com/acm/contest/79/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...