Windows 与 Linux/Unix 的GCC交叉编译

昨天经过一通宵终于搞定了Windows 与 Linux/Unix 的GCC交叉编译,把去年手上的一个UDP文件广播的代码成功在Windows 与linux 和 Unix上编译成功, 主要是Windows上比较难,不过还是经过几种环境的搭配/测试,在早上终于成功了!

Windows上测试有

cygwin : 没有成功,经过Make文件的反复调整(因为也是才从Delphi转C ,又是从Win 转 Linux 所以一些东西都比较陌生.)也编译通过,只是无法摆脱cygwin1.dll的支持,在GCC 上用 -mno-cygwin 选项编译就不通过了(经过后面的测试,还是./configure文件配置问题)

mingw: 因为无法./configure,所以也行不通

mingw+msys:一次OK!

Linux有 PuppyLinux

Unix有 NetBSD

这两个都是一次成功


后记:

现在WIN平台也有不少GCC编译环境的IDE,如Dev c++ ,他们都是通过mingw 环境支持的GCC

现在也开始玩玩C/C++ 以后要向 Delphi与C 互补的方向发展!

学习C的过程中发现,会Delphi再学C也不是什么难事!主要是编程思想!

都说C的精华是指针,确实,指针在C里可以说是体现得淋漓尽致!虽说Delphi里操作指针也是很方便,可是与C比起来就是小巫见大巫, 不过C在代码的可读性和结构规范上没D好/死,这也许就是Delphi编译器是编译速度最快的编译器的原因,对C来说也是它的优点:灵活!强大!

在我看来指针对编程来说是非常重要的,不过java c# 这样的框架编程上面我就不知道了

本来准备玩学习下MFC,现在发现这样就会失去我要学C的意义,还是D的VCL+C的DLL比较好..


附上:**对于UDP组播的一些认识 **

对于UDP组播的一些认识 利用UDP组播能在intarnet,internet上也数据报的形式进行数据的组播(在internet上进行组播,要求路由器支持IGMP(internet网关管理协议,这个协议是在IP出现以后,为了支持组播而出现的)).相对于极度消耗网络带宽的广播来说(广播只能在intranet内广播),UDP组播有了很大的优化,只有终端加入到了一个广播组,UDP组播的数据才能被他接受到. UDP组播是采用的无连接,数据报的连接方式,所以是不可靠的.也就是数据能不能到达接受端和数据到达的顺序都是不能保证的.但是由于UDP不用保证数据的可靠性,所有数据的传送速度是很快的. 组播的“根” 组播从概念上来讲分为两部分:控制部分和数据部分。控制部分决定着组播的对象的****方式。而数据部分决定了数据的传输方式。 控制层有“有根”,“无根”两种情况。对于有根的控制层,存在着一个root和若干个leaf. root负责管理这个组播组,只有他能邀请一个leaf加入一个组播组(ATM就是有根控制的一个典型的例子)。对于无根的控制层,没有root,只有若干的leaf. 每一个leaf都能自己加入一个组播组(IP就是无根控制的典型例子) 数据层也有“有根”,“无根”两种情况。对于有根数据层,从root发出的数据能到达每一个leaf,而从leaf发出的数据只能到达root.对于无根数据层,每一个leaf发出的数据能到达组播组中的每一个leaf(甚至包括他自己)。每一个leaf也能接受组播组里的任何数据包。

二.IP组播地址 IP组播通信需要一个特殊的组播地址.IP组播地址是一组D类IP地址,范围从224.0.0.0 到 239.255.255.255。其中还有很多地址是为特殊的目的保留的。224.0.0.0到224.0.0.255的地址最好不要用,因为他们大多是为了特殊的目的保持的(比如IGMP协议) 三.IGMP协议 IGMP(internet网关管理协议)是IP组播的基础.在IP协议出现以后,为了加入对组播的支持,IGMP产生了。IGMP所做的实际上就是告诉路由器,在这个路由器所在的子网内有人对发送到某一个组播组的数据感兴趣,这样当这个组播组的数据到达后面,路由器就不会抛弃它,而是把他转送给所有感兴趣的客户。假如不同子网内的A,B要进行组播通信,那么,位与A,B之间的所有路由器必须都要支持IGMP协议,否则A,B之间不能进行通信。 当一个应用加入一个组播组后,就会向这个子网的所有路由器发送一个IGMP加入命令,告诉他子网内有人对发送到某一个组播组的数据感兴趣.路由器也会定时向子网内的所有终端发送一条查询消息,用于询问是否还有人对某个组播组的数据感兴趣。如果有的话,终端就会回应一条IGMP消息,路由器则继续转发这个组播组的数据。如果没有人回应这条消息,那么路由器就认为已经没有终端对这个组播组的数据感兴趣,就不会在转发关于这个组播组的数据了。在IGMP第二版中,一个终端推出组播组以后,会向路由器发送一个推出消息,路由器也会通过这个消息来判断是否还要继续转发关于这个组播组的数据了(IGMP第一版中没有这个功能)[这些事情都是底层的系统做的,你只要坐享其成就好了]

四. winsock 1组播 winsock 1的组播主要有以下几个步骤: 建立支持数据报的scoket 把socket和本地的一个端口绑定(以后会通过这个端口进行数据的收发) 通过setsockopt  IP_ADD_MEMBERSHIP加入一个组播组 然后就能通过sendto / recvfrom进行数据的收法 通过 setsockopt IP_DROP_MEMBERSHIP离开一个组播组 关闭socket 如果你仅仅是想向一个组播组发送数据,而不要接受数据,那么可不用加入组播组,而直接通过sendto向组播组发送数据

五.winsock 2组播    winsock 2组播主要是通过WSAJoinLeaf来实现的(WSAJoinLeaf的行为,返回值根据socket的模式,组播的实现构架有很大的关系)    winsock 2组播的主要有以下几个步骤 建立支持数据报的socket(用WSASocket建立socket,同时设置组播的一些属性) 把socket和本地的一个端口绑定(以后会通过这个端口进行数据的收发) 通过WSAJoinLeaf加入一个组播组 通过sendto / recvfrom进行数据的收发 直接关闭socket,退出组播组