最近需要将一份C++代码通过Emscripten编译成asm.js,结果失败,因为这份C++代码使用MFC GUI库,导致Emscripten编译失败。这引起了我对C++跨平台移植的思考。
C++代码理论上能实现源代码级别的跨平台移植,即同一份代码可以不加修改的在不同的平台上编译运行且表现一致。这要求编写的C++代码符合跨平台移植的规范,如链接[1]所指出的那样,它给出了很多实现C++代码跨平台移植的编码细节,在编写跨平台的底层库方面十分有用。但在编写跨平台的C++应用方面,应使用经过长期实践证明能用的跨平台库来帮助编码,建立在巨人的肩膀上,使跨平台C++代码编写工作变得简单容易。下面给出一些常用的跨平台C++库供参考:
- 语言及基础库
- 标准 C++:标准 c++ 是98年制定的,现在主流的 c++ 编译器都能够比较好的支持了。这里建议使用VC7.1和GCC4.0及以上版本。在Linux中,glibc是标准C的实现,libstdc++则是标准C++的实现。在Windows中,VS2015之前MSVCRT.DLL是标准C/C++的实现,之后UCRTBASE.DLLz则是标准C/C++的实现。
- boost:boost 则是 C++ 标准委员会的一群人弄起来的一个 C++ 库集合,其中不少库以经进入 C++ TR1,可以说是准标准。使用这里的库我们有着充分的理由。象字符串的操作可以用 boost 的 String algorithms 库,格式化操作可以用 boost::format,正则式可用 boost::regex 等等。
- 网络
- ACE(Adaptive Communication Environment):ACE是一个以C++的Template技术所做成的开放源代码的可跨平台的网络应用程序的程式库套件。ACE自适配通信环境(ADAPTIVE Communication Environment)是可以自由使用、开放源码的面向对象(OO)框架(Framework),在其中实现了许多用于并发通信软件的核心模式。ACE提供了一组丰富的可复用C++ Wrapper Facade(包装外观)和框架组件,可跨越多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步,等等。
- Boost.Asio:用于网络和底层I/O编程的跨平台的C++库
- 数据库
- OTL (Oracle, Odbc and DB2-CLI Template Library):
不但支持跨平台,还跨数据库。OTL支持以下面的数据库 : OTL Oracle ,SQL Server, Access, MySQL。还有其它的库如DTL,这个库不但支持ODBC,它还支持数据库的原生接口,可以有更佳的性能。
- GUI
- QT:QT是双认证的,当你的程序免费时它就免费,你的程序打算卖钱时,它也要,而且要价很高。所以,如果有版权,成本上的考虑的话,则可以考虑wxWidgets。
- wxWidgets:wxWidgets(/wɪksˈwɪdʒɪts/,原名wxWindows)是一个开放源代码且跨平台的对象工具集(widget toolkit),其库可用来创建基本的图形用户界面(GUI)。wxWidgets由Julian Smart于1992年首先开发。
- 科学计算
- GSL:GNU科学库。
- 游戏开发
- Cocos2d-x:一个跨平台框架,用于构建2D游戏,互动图书,演示和其他图形应用程序。
- 视频
- FFmpeg:一个完整的,跨平台的解决方案,用于记录,转换视频和音频流
参考文献
- c++跨平台移植指南, by 洪柏敏.
- ACE自适配通信环境,by wikipedia.
- C++库汇总, by 工程师WWW.
- 值得推荐的C/C++框架和库, by zhihu.
- printf 格式化输出符号详细说明,by jackytse_.
- 理一理字节对齐的那些事,by 守望.
- 不见得你会计算C字符串长度,by veryitman.
- 浅析C语言之uint8_t / uint16_t / uint32_t /uint64_t,by 海阔天空sky1992.
- char,int,float,double所占字节数,by 张小铭.
- c++ 时间类型详解 time_t,by runoob.
- 网络传输——序列化,by bw_0927.
- 干货:构建C/C++良好的工程结构,by Froser.
- UTF-8与UTF-8 without BOM,by 苏州-微尘.