您的位置:首页 > 其它

初识跨平台

2012-06-28 01:16 69 查看
跨平台,顾名思义,就是程序不经修改可在不同的平台,即不同的操作系统上运行。最近由于项目需要接触了Qt,一个跨平台的C++图形用户界面应用程序开发框架。于是开始对跨平台的知识有一些稍微深入的认识。Qt支持跨平台,因此Qt支持多种包括windows和linux在内的多个版本的操作系统。既然今天谈的是跨平台,就不谈太多的Qt方面的东西,网上有大量的开发文档,Qt自身的帮助文档也很齐全,因此一个新的开发者可以快速入门。这次项目支持跨平台,因此选择了Qt进行开发。本次项目的网络数据包获取分析模块是先在linux下进行开发的,引用了libpcap库。后来需要将其移植到windows下,使用libpcap的windows版本——winpcap。因此,这两天就一直在调这一部分的程序,以屏蔽操作系统差异性。这次项目分为四大模块,小组成员恰好每人负责一个模块。由于网络获取模块的组员之前没考虑程序的移植问题,因此使用了部分linux下系统函数的结构体和宏定义,所幸的是,其并没有大量使用linux系统函数,只是引用了如tcp.h,udp.h,ip.h等头文件,因此使得程序的移植并没有特别麻烦。下面我就讲一下这次跨平台程序调试大概使用的方法。1.对于一些程序中使用的结构体,如tcphdr,udphdr,iphdr等,由于windows函数被封装成库,linux下对应的一些函数在windows下无法使用该函数,因此可在程序中定义一个头文件,然后把结构体和宏定义写在同一个头文件里面,然后在程序中include该头文件即可。如本次我在程序中定义了一个新的头文件libpcapstruct.h,然后加入类似如下的宏定义和头文件:#define ETHERTYPE_IP 0x0800/*IP*/
#define  ETHERTYPE_ARP0x0806		/* Address resolution */
struct udphdr {
unsigned short int uh_sport;		/* source port */
unsigned short int uh_dport;		/* destination port */
unsigned short int uh_ulen;		/* udp length */
unsigned short int uh_sum;		/* udp checksum */
};
2.很多库在linux和windows上有着相同的库名以及相同的API,这样的话,在linux和windows下可include相同的头文件,然而有一点不同的地方是库的路径是有区别的。因此,需要在.pro文件中导入库的时候区分windows和linux的区别,并分别把库的路径和库的名字引入。前面已经提及,linux下捕获包使用的库是libpcap,而与之匹配的windows下使用的为winpcap。两个库虽然命名不同但实现却是相同的,里面的函数也都一致。在这次项目中需要导入pcap,libpcap/winpcap的一个抓包库,因此在头文件中#include<pcap.h>。值得一提的是,winpcap安装完之后,要下一个winpcap开发包,里面有winpcap的各种开发函数,pcap也包括在里面。在#include<pcap.h>之后,再在.pro中加入如下内容:
win32:LIBS+=G:/QtSDK/extends_lib/pcap/Lib/Packet.lib G:/QtSDK/extends_lib/pcap/Lib/wpcap.lib
else:unix: LIBS += -L$$PWD/./ -lpcap
这样程序不管在windows或者linux都可以使用pcap库进行开发。
3.有些时候必须用到linux或者windows下的函数,而这些函数已经封装在库文件里面而无法获取其实现的代码,因此无法把该函数写如到自己定义的头文件中,这时候就必须在程序中引用该头文件。这样的话,有些头文件就存在操作系统的差异性。如windows系统开发时使用的windows.h,当引用这个头文件到linux下是无法编译通过的,因为linux下并没有这个头文件。同样的,在linux下需要 #include <arpa/inet.h>,为了实现这个程序这个头文件在linux下必不可少,这样的话到了windows下同样编译不过。这个时候有一个方法,可让程序同时引用这两个头文件而同时可在windows和linux编译通过,且运行正确,具体方法如下:
#ifdef __linux#include <arpa/inet.h>
#endif
#ifdef _WIN32#include <windows.h>
#endif
对于一些和操作系统联系紧密的结构体也可用上面的方法实现:
#ifdef __linuxtypedef unsigned int in_addr_t;
struct in_addr
{
   in_addr_t s_addr;
};
#endif
上面就是这两天所用到的一些跨平台的知识,当然这也只是才入门,据说写文章可以加深自己对知识的印象和理解,因此把这两天的心得写下来,希望对自己以后的学习有所帮助。今后还是要继续深入,如果有更深的认识再拿出来和大家分享,对于本文不正确的地方也希望大家指正,相互学习,共同进步。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: