C++跨平台开发的体会(仅限于PC平台)

TinyIM在ubuntu上可以编译运行了,最基础的ChatServer,ClientCore,ImRobot都可以跑起来。开发工作暂时告一段落,现在总结一下我开发TinyIM过程中遇到问题和自己的体会。

1. 构建工具

因为之前在LXSJ和ADT的工作经历,构建工具我选择了CMake。CMake是一个跨平台的构建工具,不仅同时支持很多的平台,还在同一个平台上支持不同的IDE。我还听过其他构建工具,但是鉴于对其他工具不熟悉,我还是会推荐你使用CMake。

2. 求同存异

对于C++来说,跨平台的区别主要有网络库、文件系统、字符编码转换、进程线程操作和同步。我对于上面的几个问题是怎么选择的。

  1. 网络库

网络库我选择了asio,这是一个跨平台的网络库,已经在boost库中了。在LXSJ的时候用过,在Linux和MacOS上测试过,后来我在Windows上也用过了,所以选择它作为网络库。libevent也是可以跨平台的,不过我这个网络库我没有用过。

  1. 文件系统

C++的17已经有std::file_system的相关的文件系统标准库了,但是我对C++17的标准不熟悉,所以在TinyIM的代码中,我通过两种方式实现了跨平台。(1)对于可以使用C标准函数的地方,使用C的标准函数。(2)如果找不到C标准函数可以用,就采用条件编译的方式。如果需要支持比较老的操作系统,可以采用这样的方式。TinyIM计划以后将此部分改为标准库的使用。

  1. 字符编码转换

字符编码转换的部分,在Windows平台上使用的是win32的API函数,在Linux平台上使用的是<codecvt><locale>,不过TinyIM使用这个部分的代码没有进行过严格的测试,以后再进行完善。

  1. 进程线程操作

TinyIM没有使用到多进程的代码,多线程的部分使用的是std::thread。不过TinyIM没有使用到多线程同步的代码,此处标准库有std::mutex等相关的代码可以使用。

3. 其他

在Windows平台的时候,因为我的编译器警告级别只开到了W3,所以对于没有使用的参数和变量没有编译器的警告。在Linux平台编译的时候,编译器就可以看到这样的程序问题。所以对于程序除了提高编译器的警告级别外,还可以从不同的编译器角度来审视代码,也可以提高代码质量。