跨平台C++服务器程序开发 (1)了解跨平台开发

跨平台服务器程序的作用

所谓跨平台,主要指Windows和Linux两个主要平台。如今绝大多数服务器后端程序运行在Linux平台,这是因为Linux具有免费、开源、远程操控方便、易于大规模运维管理等优点,相比之下,Windows平台更适用于个人用户的办公和娱乐,因此服务器程序多数要在Linux平台上运行。

但是在开发过程中,大部分开发者更习惯使用Windows平台的Visual Studio(简称VS)集成开发环境,而不习惯Linux平台的开发工具如vim、emacs、eclipse等,虽然说各有喜好,但总体来说还是VS更方便高效,有代码智能提示、查找引用、批量改名、可视化调试等优点。所以从开发效率角度考虑,Visual Studio是最好的开发工具。

所以理想情况下我们既希望使用Windows平台的VS作为开发工具,又希望编写的代码能够在Linux平台编译运行,而满足这两个条件就需要我们开发跨平台的程序,这就是跨平台程序的作用。

跨平台程序实现方法

要实现同一份代码在Windows和Linux平台都编译通过并不难,因为标准c/c++在设计时就是跨平台的,可以写一段最简单的HelloWorld代码分别在VS和gcc环境下编译,肯定能编译通过。

但显然不太可能在项目中只使用c/c++标准库函数,我们还要使用系统api函数,比如创建线程函数,在Windows里是_beginthreadex函数,在Linux里是pthread_create函数,所以在不同平台编译时需要加以区分,这里可以通过预定义宏实现。

通过VS创建项目时,会自动生成WIN32_WIN32两个宏。在编写Linux平台使用的makefile时,我们也可以手动添加一个宏_LINUX用于指定是在Linux平台下编译。

下面为一个跨平台创建线程代码段:

#ifdef WIN32
    HANDLE hThread = (HANDLE)_beginthreadex( ... );
#else
    int result = pthread_create( ... );
#endif

若定义了宏WIN32(Windows平台),使用_beginthreadex函数,否则使用pthread_create函数,这里指的是编译期的处理。

当然我们也可以改用_LINUX宏来做判断,代码如下:

#ifndef _LINUX
    HANDLE hThread = (HANDLE)_beginthreadex( ... );
#else
    int result = pthread_create( ... );
#endif

若没有定义_LINUX宏,表明不是Linux平台。通过宏定义,区分编译期需要编译的代码,以实现跨平台的效果。

开发环境

Windows平台有Visual Studio集成开发环境,搭配svn版本管理工具,基本满足开发需求。

Linux平台用到的主要工具如下:

功能 名称
文本编辑器 vim
源代码版本管理 svn
调试 gdb
编译 g++
编译脚本 cmake
典型的开发流程:
  1. 在VS里编辑代码,并在Windows平台编译调试通过,通过svn上传代码。
  2. 通过远程工具连接Linux,在shell命令行里使用svn更新代码,使用cmake编写编译脚本,并执行代码编译。
  3. 若在Linux下编译报错,找到错误原因后,使用vim修改代码,编译成功后,通过svn上传修改内容。
  4. 若需要在Linux环境下调试,通过gdb关联正在运行的进程,或者直接通过gdb启动调试进程,在命令行下进行调试。

本文讲解了跨平台开发的背景、实现方法、开发环境,希望对大家有所帮助。

你可能感兴趣的:(C++)