如何在windows下linux交叉编译windowslinux的开源程序

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&热门关键字:
10年Windows与Linux程序员的区别
如果一个程序员从来没有在Linux,Unix下开发过程序,一直在Windows下面开发程序, 同样是工作10年, 大部分情况下与在Linux,unix下面开发10年的程序员水平会差别很大。这篇文章并不是想贬低Windows下面开发的人,做Windows开发的人看了可能会感觉不舒服,我并不是这个意思,我只是说说我自己的感受。
我最早开始学习编程也是在Windows下面的, 学的是VB,后来转到VC++,当时用的是VC6.0, 做Windows下面的开发5年后转入Linux下面做开发的,开始在Linux下面做开发的时候, 也做过很多Windows下面的项目,在Linux下面做开发确实比我在Windows下面做开发多学到了很多的东西,从开源代码里面吸取了丰富的营养,我不是说我是个高手, 只是说在Linux下面学习,你会进步的更快。
不过我需要强调一下,我这里说的是 &大部分情况下&,意思就是说&在同样勤奋,同样努力程度,同样基础知识,同样工作年限,同样是做应用程序的开发& 的情况下,如果说的不对,希望大家在下面发表看法。
可能大家会奇怪, 为何会出现这种情况呢 ?听我慢慢道来!
第一:闭源与开源
Windows下面的程序基本都是封闭源代码的,特别是10年前,在Windows下可以说找不到可用的开源的软件,现在的情况比以前好多了, 很多Linux下面开源的程序被移植到Windows下面来,但是Linux下面开源的程序增加的更多了。
以前在Windows下面写应用程序, 需要用到MFC,WINSOCK,ODBC,FILE& IO等, 可以找资料的地方主要是微软官方的文档MSDN,也只有MSDN才是最全的地方,下来是第三方网站 vckbase, CSDN, codeproject 这几个网站。 但是从这些网站找到的代码,都是针对一个特定的小功能,为了演示如何实现这个小功能而写的代码,写代码的水平参差不齐,风格各异,都是一些demo性质的小东西,简单研究看看代码,就可以集成到自己的应用程序里面。如何构建一个完整的应用程序, 架构良好的应用程序, 大学里面不会教你, 一切都得靠自己摸索,在公司里面做项目获得提升,直到项目商用,后期维护修改代码时, 回头看自己写的代码, 才深刻体会到,自己当时写的代码架构是多么的不合理,维护修改是如此的困难。如果在互联网上找不到自己需要的资料,就只能靠自己想一些实现的方法,虽然功能完成了, 可能完成的时候还很有成就感,但是等那天你突然发现有人实现这个功能,并且用了一个巧妙的方法, 这是你才突然恍悟, 我当时为何就想不到这么实现呢?
在Windows下面开发, 不太容易找到可以参考的类似你要完成功能的开源项目。一切都得靠自己。但是在Linux下面就不一样了, 当你要开发一个新项目时, 可以想想有没有什么开源项目也完成了类似的功能, 可以下载到源代码来做一个参考, 对其中的算法, 架构设计等做一个详细的了解,然后自己开发的时候就会比较得心应手了,可以避免别人犯过的错误,少走很多弯路。
第二:要学习的知识量不一样
学习window下的开发, 你需要学习很多的Windows API,截止到2009年9月,Windows总API数量为2258个, 并且Windows API 的参数多, 参数类型复杂,要记住这么多东西不是一件容易的事情,至少也和学习一门外语一样,大学英语四级要求掌握的总词汇量达到4500个单词。可想而知, 学会这么多的API用法,有多难了吧。
那么学习Linux下, 要掌握多少API呢 ?&Linux下的内核API, 全部算下来也才335,但是这些内核的API只有编写驱动的时候才能用到, 开发应用程序基本用不到内核的API,开发应用程序的API基本都是C的API,而 Linux所有的C的API个数是279个, 也就是说你只需要掌握不到300个的API, 就可以顺利的在Linux下面开发应用程序了,相比学习Windows下面的那一堆API来说, 你是不是可以省下很多时间来学习其他知识呢?
下面我就举个简单的例子:
CreateFile ReadFile OpenFile WriteFile DeleteFile ReadFileEx WriteFileEx CloseHandle
上面这些API是Windows下面对文件操作的API, 总共是8个,看看CreateFile的参数吧,
HANDLE WINAPI CreateFile( __in LPCTSTR lpFileName, __in DWORD dwDesiredAccess, __in DWORD dwShareMode, __in LPSECURITY_ATTRIBUTES lpSecurityAttributes, __in DWORD dwCreationDisposition, __in DWORD dwFlagsAndAttributes, __in HANDLE hTemplateFile );
这些参数的意义和类型, 请问你需要花多少时间来掌握呢 ?
我们在看看Linux下面对文件操作的C的API有几个,
fopen fwrite fread fclose
共四个,我们在看看参数吧
FILE *fopen( const char *filename, const char *mode );
两个参数, 请问你需要花多少时间掌握呢。可能有的人会提出意见,说上面C的API也能在Windows下面运行啊?
没错, 是能在Windows下面运行,但是你就掌握这跨平台的C的API够吗? 难道所有在Windows下面开发的人都喜欢用C的API, 不会用Windows本身的API吗?你不需要学习Windows下面的API吗? 你的同事使用了CreateFile这个函数, 你不需要搞懂他吗? 你不需要看同事的代码吗? 你不需要去维护别人写过的代码吗?
如果你还是这么想,那我还可以再举其他例子!就拿创建线程的例子吧,下面是2个在Windows下面创建线程的例子, 第一个是创建安全工作线程, 第二个是创建界面线程,还有一个函数我没有放下面, 是创建不安全的工作线程的,具体的原理大家可以参考《win32多线程程序设计》,作者:(美)Jim Beveridge & Robert Wiener 著,侯捷 译&这本书。
uintptr_t&& _beginthreadex( && void *security, && unsigned stack_size, && unsigned ( *start_address )( void * ), && void *arglist, && unsigned initflag, && unsigned *thrdaddr
HANDLE WINAPI CreateThread( & __in&&&&&&&&& LPSECURITY_ATTRIBUTES lpThreadAttributes, & __in&&&&&&&&& SIZE_T dwStackSize, & __in&&&&&&&&& LPTHREAD_START_ROUTINE lpStartAddress, & __in&&&&&&&&& LPVOID lpParameter, & __in&&&&&&&&& DWORD dwCreationFlags, & __out&&&&&&& LPDWORD lpThreadId );
做Windows下面的开发, 上面两个创建线程的函数我们都必须掌握。当然了, 你也可以只需要知道 _beginthreadex 来在Windows下面通吃,但是当看到别人的代码使用CreateThread的时候, 你可不要不习惯,MFC里面很多人都用CreateThread。 掌握这么多的API累吧 ?& 就和你上学的时候背单词一样累。
下面我在列一下Linux下面创建线程的函数
int pthread_create( pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*),
void *restrict arg);
看到了吧, 你只需要知道这个就可以了。
C的API 绝大部分都可以再Windows下面运行,在Windows下面学习开发, 你不但要懂得C的API, 你还需要多花时间来学习Windows系统本身的API, 你可能要说, 这么说应该是Windows下面学得多啊, 我要说的是你掌握的API是很多, 但是对于一个软件来说, 最最重要的是系统架构,数据结构,架构设计的好, 对后期的代码维护,功能修改都很关键, 这也就是新手写的代码, 到最后连他自己本人都很难维护的原因, 更别说让别人来维护了。
API相当于基本功, 系统架构, 数据结构是内功,基本功练的越快,我们就越有更多的时间来练习内功。练习内功,我们要多向高手学习。
在学习Windows 下面开发应用的道路上, 我们需要掌握更多的API, 学习后, 让我们的路越走越窄, 没有特别丰富的开源代码可以参考, 水平提高的速度很慢。
可喜的是, 现在很多开源的项目被很多人移植到了Linux下面, 也有很多的开源项目是跨平台的, 常用的是 wxWidget界面库, 用法类似MFC, 还有qt这个界面库, 也很强大,还有开源的3D引擎OGRE, 架构非常好,很值得学习其架构模式。但是Linux下面的开源库要远远比Windows下面的开源库丰富得多, 我们可以方便的从高手的代码里面学习数据结构,学习设计模式,学习编程技巧,这也就是Linux下面的程序员, 可能会比Windows下面的程序员水平更高的原因, 毕竟见多识广嘛, 熟读唐诗三百首,不会作诗也会吟啊!
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
嵌入式linux中文站
用微信扫一扫关注我们
随时获取最新开源资讯君,已阅读到文档的结尾了呢~~
Windows平台下构建嵌入式Linux交叉编译环境,嵌入式交叉编译环境,windows交叉编译,windows arm 交叉编译,linux arm 交叉编译,linux交叉编译环境,linux交叉编译,linux交叉编译工具,linux安装交叉编译器,linux内核交叉编译
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
Windows平台下构建嵌入式Linux交叉编译环境
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口想要将Linux下库源码在Windows下编译为Dll
[问题点数:40分,结帖人luoweicool]
想要将Linux下库源码在Windows下编译为Dll
[问题点数:40分,结帖人luoweicool]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。项目越来越大,每次需要重新编译整个项目都是一件很浪费时间的事情。Research了一下,找到以下可以帮助提高速度的方法,总结一下。&
  tmpfs&
  有人说在Windows下用了RAMDisk把一个项目编译时间从4.5小时减少到了5分钟,也许这个数字是有点夸张了,不过粗想想,把文件放到内存上做编译应该是比在磁盘上快多了吧,尤其如果编译器需要生成很多临时文件的话。&
  这个做法的实现成本最低,在Linux中,直接mount一个tmpfs就可以了。而且对所编译的工程没有任何要求,也不用改动编译环境。&
  mount -t tmpfs tmpfs ~/build -o size=1G&
  用2.6.32.2的Linux Kernel来测试一下编译速度:&
  用物理磁盘:40分16秒&
  用tmpfs:39分56秒&
  呃&&没什么变化。看来编译慢很大程度上瓶颈并不在IO上面。但对于一个实际项目来说,编译过程中可能还会有打包等IO密集的操作,所以只要可能,用tmpfs是有益无害的。当然对于大项目来说,你需要有足够的内存才能负担得起这个tmpfs的开销。&
  make -j&
  既然IO不是瓶颈,那CPU就应该是一个影响编译速度的重要因素了。&
  用make -j带一个参数,可以把项目在进行并行编译,比如在一台双核的机器上,完全可以用make -j4,让make最多允许4个编译命令同时执行,这样可以更有效的利用CPU资源。&
  还是用Kernel来测试:&
  用make: 40分16秒&
  用make -j4:23分16秒&
  用make -j8:22分59秒&
  由此看来,在多核CPU上,适当的进行并行编译还是可以明显提高编译速度的。但并行的任务不宜太多,一般是以CPU的核心数目的两倍为宜。&
  不过这个方案不是完全没有cost的,如果项目的Makefile不规范,没有正确的设置好依赖关系,并行编译的结果就是编译不能正常进行。如果依赖关系设置过于保守,则可能本身编译的可并行度就下降了,也不能取得最佳的效果。&
  ccache&
  ccache用于把编译的中间结果进行缓存,以便在再次编译的时候可以节省时间。这对于玩Kernel来说实在是再好不过了,因为经常需要修改 一些Kernel的代码,然后再重新编译,而这两次编译大部分东西可能都没有发生变化。对于平时开发项目来说,也是一样。为什么不是直接用make所支持 的增量编译呢?还是因为现实中,因为Makefile的不规范,很可能这种&聪明&的方案根本不能正常工作,只有每次make clean再make才行。&
  安装完ccache后,可以在/usr/local/bin下建立gcc,g++,c++,cc的symbolic link,链到/usr/bin/ccache上。总之确认系统在调用gcc等命令时会调用到ccache就可以了(通常情况下/usr/local /bin会在PATH中排在/usr/bin前面)。&
安装的另外一种方法:&
vi ~/.bash_profile&
把/usr/lib/ccache/bin路径加到PATH下&
PATH=/usr/lib/ccache/bin:$PATH:$HOME/bin&
这样每次启动g++的时候都会启动/usr/lib/ccache/bin/g++,而不会启动/usr/bin/g++&
效果跟使用命令行ccache g++效果一样:)&
这样每次用户登录时,使用g++编译器时会自动启动ccache&
  继续测试:&
  用ccache的第一次编译(make -j4):23分38秒&
  用ccache的第二次编译(make -j4):8分48秒&
  用ccache的第三次编译(修改若干配置,make -j4):23分48秒 &
 看来修改配置(我改了CPU类型...)对ccache的影响是很大的,因为基本头文件发生变化后,就导致所有缓存数据都无效了,必须重头来 做。但如果只是修改一些.c文件的代码,ccache的效果还是相当明显的。而且使用ccache对项目没有特别的依赖,布署成本很低,这在日常工作中很 实用。&
  可以用ccache -s来查看cache的使用和命中情况:&
  cache directory /home/lifanxi/.ccachecache hit 7165cache miss 14283called for link 71not a C/C++ file 120no input file 3045files in cache 28566cache size 81.7 Mbytesmax cache size 976.6 Mbytes&
  可以看到,显然只有第二编次译时cache命中了,cache miss是第一次和第三次编译带来的。两次cache占用了81.7M的磁盘,还是完全可以接受的。&
  distcc&
  一台机器的能力有限,可以联合多台电脑一起来编译。这在公司的日常开发中也是可行的,因为可能每个开发人员都有自己的开发编译环境,它们的编译器版本一般是一致的,公司的网络也通常具有较好的性能。这时就是distcc大显身手的时候了。&
  使用distcc,并不像想象中那样要求每台电脑都具有完全一致的环境,它只要求源代码可以用make -j并行编译,并且参与分布式编译的电脑系统中具有相同的编译器。因为它的原理只是把预处理好的源文件分发到多台计算机上,预处理、编译后的目标文件的链 接和其它除编译以外的工作仍然是在发起编译的主控电脑上完成,所以只要求发起编译的那台机器具备一套完整的编译环境就可以了。&
  distcc安装后,可以启动一下它的服务:&
  /usr/bin/distccd --daemon --allow 10.64.0.0/16&
  默认的3632端口允许来自同一个网络的distcc连接。&
  然后设置一下DISTCC_HOSTS环境变量,设置可以参与编译的机器列表。通常localhost也参与编译,但如果可以参与编译的机器很 多,则可以把localhost从这个列表中去掉,这样本机就完全只是进行预处理、分发和链接了,编译都在别的机器上完成。因为机器很多 时,localhost的处理负担很重,所以它就不再&兼职&编译了。&
  export DISTCC_HOSTS=&localhost 10.64.25.1 10.64.25.2 10.64.25.3&&
  然后与ccache类似把g++,gcc等常用的命令链接到/usr/bin/distcc上就可以了。&
  在make的时候,也必须用-j参数,一般是参数可以用所有参用编译的计算机CPU内核总数的两倍做为并行的任务数。&
  同样测试一下:&
  一台双核计算机,make -j4:23分16秒&
  两台双核计算机,make -j4:16分40秒&
  两台双核计算机,make -j8:15分49秒&
  跟最开始用一台双核时的23分钟相比,还是快了不少的。如果有更多的计算机加入,也可以得到更好的效果。&
  在编译过程中可以用distccmon-text来查看编译任务的分配情况。distcc也可以与ccache同时使用,通过设置一个环境变量就可以做到,非常方便。&
  总结一下:&
  tmpfs: 解决IO瓶颈,充分利用本机内存资源&
  make -j: 充分利用本机计算资源&
  distcc: 利用多台计算机资源&
  ccache: 减少重复编译相同代码的时间&
  这些工具的好处都在于布署的成本相对较低,综合利用这些工具,就可以轻轻松松的节省相当可观的时间。上面介绍的都是这些工具最基本的用法,更多的用法可以参考它们各自的man page。
相关文章列表:

我要回帖

更多关于 linux交叉编译windows 的文章

 

随机推荐