原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。: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. 目标跟踪之camshift---opencv中meanshift和camshift例子的应用

    在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行op ...

  2. &lt;二代測序&gt; 下载 NCBI sra 文件

    本文近期更新地址: http://blog.csdn.net/tanzuozhev/article/details/51077222 随着測序技术的不断提高.二代測序数据成指数增长. NCBI提供了S ...

  3. VI使用说明 (转)

    vi使用方法(ZT)         vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Lin ...

  4. 【BZOJ3065】带插入区间K小值 替罪羊树+权值线段树

    [BZOJ3065]带插入区间K小值 Description 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理 ...

  5. EasyNVR RTSP转RTMP-HLS流媒体服务器前端构建之:使用BootstrapPagination以分页形式展示数据信息

    上一篇介绍通过接口来获取数据,本篇将介绍如何以分页形式展示出接口获取到的数据 获取到的数据往往会很多,为了追去页面的美观和方便用户的检索,需要进行分页的展示: EasyNVR可接如多通道,当我们的通道 ...

  6. 九度OJ 1050:完数 (数字特性)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7535 解决:3125 题目描述: 求1-n内的完数,所谓的完数是这样的数,它的所有因子相加等于它自身,比如6有3个因子1,2,3,1+2+ ...

  7. Hadoop实战-Flume之Source regex_extractor(十二)

    a1.sources = r1 a1.sinks = k1 a1.channels = c1 # Describe/configure the source a1.sources.r1.type = ...

  8. 一起来学linux:SAMBA服务器搭建

    前面介绍的NFS服务器的用来linux和linux系统之间共享文件和目录的,那如果是linux和windows之间需要共享修改文件该如何操作呢.这据需要用到SAMBA系统.我们首先来看下SAMBA系统 ...

  9. Javascript闭包机制(转)

    原文地址:http://www.felixwoo.com/archives/247 参考:http://www.ruanyifeng.com/blog/2009/08/learning_javascr ...

  10. 【Leetcode-easy】Roman to Integer

    罗马数字转化为整数 * 1.基本数字 Ⅰ.X .C 中的任何一个.自身连用构成数目.或者放在大数的右边连用构成数目.都不能超过三个:放在大数的左边只能用一个: * 2.不能把基本数字 V .L .D ...