跨平台服务器程序的作用
所谓跨平台,主要指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 |
典型的开发流程:
- 在VS里编辑代码,并在Windows平台编译调试通过,通过svn上传代码。
- 通过远程工具连接Linux,在shell命令行里使用svn更新代码,使用cmake编写编译脚本,并执行代码编译。
- 若在Linux下编译报错,找到错误原因后,使用vim修改代码,编译成功后,通过svn上传修改内容。
- 若需要在Linux环境下调试,通过gdb关联正在运行的进程,或者直接通过gdb启动调试进程,在命令行下进行调试。
本文讲解了跨平台开发的背景、实现方法、开发环境,希望对大家有所帮助。