初识跨平台

         跨平台,顾名思义,就是程序不经修改可在不同的平台,即不同的操作系统上运行。最近由于项目需要接触了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_ARP    0x0806		/* 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 __linux
    typedef unsigned int in_addr_t;
    struct in_addr
    {
       in_addr_t s_addr;
     };
    #endif

    上面就是这两天所用到的一些跨平台的知识,当然这也只是才入门,据说写文章可以加深自己对知识的印象和理解,因此把这两天的心得写下来,希望对自己以后的学习有所帮助。今后还是要继续深入,如果有更深的认识再拿出来和大家分享,对于本文不正确的地方也希望大家指正,相互学习,共同进步。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值