原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。: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] -- 交叉编译原来如此简单的更多相关文章

  1. 激活Windows 8.1 RTM原来如此简单

    日前,Windows 8.1 RTM各种版本已经在坊间泄露开来,许多迫不及待的用户也开始跃跃欲试,但可能有人会疑惑,Windows 8.1RTM该如何激活?其实,它远比你想象的要简单. 实际上,Win ...

  2. 华为云软件开发云:容器DevOps,原来如此简单!

    当开发团队把代码提交到 Git 应用仓库的那一刻,他们心里在想什么? 祈祷没有bug?渴望回家补觉?产品经理Go Die? 对,也不对.因为这只是最终发布万里长征的一小步,接下来要面对测试环境.生产环 ...

  3. 【Spring】Spring的定时任务注解@Scheduled原来如此简单

    1 简介 定时任务的实现非常多,JDK的Timer.Spring提供的轻量级的Scheduled Task.QuartZ和Linux Cron等,还有一些分布式的任务调度框架.本文主要介绍Schedu ...

  4. git原理,git命令使用详解,github使用 --有此图文并茂原来如此简单

    一.Git分布式控制系统原理:git有三个区,被管理的代码或文件是从:工作区-->暂存区-->本地版本库. 二.GitHub创建线上仓库GitHub是一个面向开源及私有软件项目的托管平台, ...

  5. JS防抖和节流:原来如此简单

    一.函数防抖 前端开发工作中,我们经常在一个事件发生后执行某个操作,比如鼠标移动时打印一些东西: window.addEventListener("mousemove", ()=& ...

  6. K8S原来如此简单(七)存储

    emptyDir临时卷 有些应用程序需要额外的存储,但并不关心数据在重启后仍然可用. 例如,缓存服务经常受限于内存大小,将不常用的数据转移到比内存慢.但对总体性能的影响很小的存储中. 再例如,有些应用 ...

  7. 【基础知识】Flex-弹性布局原来如此简单!!

    简言 布局的传统解决方案是基于盒状模型,依赖 display + position + float 方式来实现,灵活性较差.2009年,W3C提出了一种新的方案-Flex,Flex是Flexible ...

  8. K8S原来如此简单(三)Pod+Deployment

    上篇我们已经安装好k8s1.23集群,现在我们开始使用k8s部署我们的项目 Pod Pod 是一组容器集合,是可以在 Kubernetes 中创建和管理的.最小的可部署的计算单元.这些容器共享存储.网 ...

  9. K8S原来如此简单(四)Service+Ingress

    上一篇我们通过deployment实现了pod的横向扩展,但是仍然不能负载,也不能对外提供服务,现在我们来看看如何通过k8s实现负载与外网访问 Service service为一组pod提供一个统一的 ...

随机推荐

  1. MongoDB学习笔记&lt;六&gt;

    继续mongoDB的学习 --索引具体解释 --索引管理 --空间索引 1.创建简单索引 (1)先准备20万条数据 for(var i = 0;i< 200000;i++){ db.books. ...

  2. 【BZOJ4197】[Noi2015]寿司晚宴 状压DP+分解质因数

    [BZOJ4197][Noi2015]寿司晚宴 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴 ...

  3. 九度OJ 1163:素数 (素数)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8496 解决:2887 题目描述: 输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和这个整数 ...

  4. 九度OJ 1021:统计字符 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5418 解决:3146 题目描述:     统计一个给定字符串中指定的字符出现的次数. 输入:     测试输入包含若干测试用例,每个测试用 ...

  5. .net 开源框架--转载

    Json.NET http://json.codeplex.com/ Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单.通过Li ...

  6. FI 常用表

    FI 常用表 GL部分:FAGLFLEXT(FMGLFLEXT)   总账汇总表 GLT0        旧总帐汇总表           SKA1        总账科目主记录 (科目表)      ...

  7. SQL 中GROUP BY 、ROLLUP、CUBE 关系和区别

    转自:http://www.cnblogs.com/dyufei/archive/2009/11/12/2573974.html 不言自明,看SQL就完全理解了,不需要过多解释,不错,分享之: ROL ...

  8. POJ - 3984 迷宫问题 【BFS】

    题目链接 http://poj.org/problem?id=3984 思路 因为要找最短路 用BFS 而且 每一次 往下一层搜 要记录当前状态 之前走的步的坐标 最后 找到最短路后 输出坐标就可以了 ...

  9. nodejs搭建简单的websocket服务端

    创建websocket服务端使用了nodejs-websocket ,首先要安装nodejs-websocket,在项目的目录下: npm install nodejs-websocket 1.搭建w ...

  10. ES6 Class基本用法

    JavaScript 语言中,生成实例对象的传统方法是通过构造函数.下面是一个例子. function Point(x, y) { this.x = x; this.y = y; } Point.pr ...