编译系统对跨平台代码的支持

问题

起因

  • 项目需要跑在不同的平台上
  • 不希望代码中掺杂大量的define宏做平台判断(有洁癖呀~~~)
  • 定义一些通用宏来处理只能解决一些类型差异的问题

处理

  • 将跨平台代码写入不同的文件夹下 os/linux 和 os/win
  • 在外部暴露的.h文件加入判断宏
//file: public.h
#ifdef WIN32
#    include "os/windows/public.h"
#else
#    include "os/linux/public.h"
#endif //WIN32
  • 其他代码直接使用#include "public.h"

产生问题

使用的编译构建系统如何来识别这些编译哪个目录下的文件,在链接的时候如何选择库

不同的编译系统下的解决

直接Makefile

通过宏来区分

ifdef WIN32
    SOURCES += $(wildcard os/win/*.cpp)
else
    SOURCES += $(wildcard os/linux/*.cpp)
endif

cmake

cmake通过逻辑语句和预定义变量来判定

if(WIN32)
    aux_source_directory(os/win SOURCES)
else(APPLE)
    aux_source_directory(os/mac SOURCES)
else(UNIX)
    aux_source_directory(os/linux SOURCES)
endif(WIN)

qmake

qt的.pro文件支持直接以

!unix {
    SOURCES += comm.cpp
}
win32:debug {
    TARGET = client_debug.exe
}
win32 | macx {
    HEADERS += debug.h
}
linux-g++ {
    CONFIGS += c++11
}

的方式来定义跨平台代码。

编译系统对跨平台代码的支持

时间: 2024-10-12 21:06:17

编译系统对跨平台代码的支持的相关文章

tinyhttpd跨平台代码兼容linux和solaris

tinyhttpd是超轻量级的web服务器,代码量只有500余行,因此非常适合学习web服务器的工作原理.然而,代码是在solaris下编写,不过作者在httpd.c中作出linux下的编译的修改方法,如下: This program compiles for Sparc Solaris 2.6. To compile for Linux: 1) Comment out the #include <pthread.h> line. 2) Comment out the line that de

跨平台代码重用

“前.NET Core时代”如何实现跨平台代码重用 ——源文件重用 微软在2002年推出了第一个版本的 .NET Framework,这是一个主要面向Windows 桌面(Windows Forms)和服务器(ASP.NET Web Forms)的基础框架.在此之后,PC的霸主地位不断受到其他设备的挑战甚至取代,为此微软根据设备自身的需求对.NET Framework作了相应的简化和改变,不断推出了针对具体设备类型的.NET Framework,主流的包括Windows Phone.Window

“前.NET Core时代”如何实现跨平台代码重用 ——程序集重用

除了在源代码层面实现共享(“前.NET Core时代”如何实现跨平台代码重用 ——源文件重用)之外,我们还可以跨平台共享同一个程序集,这种独立于具体平台的“中性”程序集通过创建一种名为“可移植类库(PCL: Portable Class Library)”项目来实现.为了让读者朋友们对PCL的实现机制具有充分的认识,我们先来讨论一个被我称为“程序集动态绑定”的话题. 一.何谓程序集动态绑定? 我们采用C#.VB.NET这样的编程语言编写的源文件经过编译会生成有IL代码和元数据构成的托管模块,一个

MAC OS下编译apple跨平台的libevent库 (可延申到其它第三库)

apple下的跨平台是指不同设备上的苹果系统以及同一系统在不同cpu体系的不同版本. 前面一篇介绍如何用ndk编译android跨平台的第三库,那样的方法却不能应用在apple上. 网上可以找到这么一个脚本,其主要过程和功能如下图: 脚本主要依靠了xcrun -sdk命令来搜索出平台关联的编译程序和SDK目录位置.不像ndk的目录结构,苹果的目录结构不清晰有些又不统一,xcrun就是这个咨客,问它就是了. 只要将脚本中相应的容器修改就可以应用到其它第三库的编译中去. 接下来就编译过程中的怪问题.

微软良心之作——Visual Studio Code 开源免费跨平台代码编辑器

微软良心之作--Visual Studio Code 开源免费跨平台代码编辑器 在 Build 2015 大会上,微软除了发布了 Microsoft Edge 浏览器和新的 Windows 10 预览版外,最大的惊喜莫过于宣布推出免费跨平台的 Visual Studio Code 编辑器了! Visual Studio Code (简称 VS Code / VSC) 是一款免费开源的现代化轻量级代码编辑器,支持语法高亮.智能代码补全.自定义热键.括号匹配.代码片段.代码对比 Diff.GIT 等

.NetCore技术研究-一套代码同时支持.NET Framework和.NET Core

在.NET Core的迁移过程中,我们将原有的.NET Framework代码迁移到.NET Core.如果线上只有一个小型的应用还好,迁移升级完成后,只需要维护.NET Core这个版本的代码. 但是,如果是一个大型分布式应用,几百台Server,上千个.NET 应用进程.这种场景下,在一定的时期内,我们需要同时维护.NET Framework和.NET Core两套代码,同一个产品 特性,需要分别在两套代码中实现,这种代码同步的工作量是非常大的.因此,在这种场景下,有必要使用同一套代码既支持

iOS 编译含C++代码出现ld: symbol(s) not found for architecture i386错误之解决(转载)

最近项目需要搭建自己的IM服务器,在快速配置好Openfire之后,开始研究使用gloox开发XMPP客户端实现通信, 先下载gloox源码,然后./configure,make ,sudo make install,在/usr/local/下找到头文件夹和静态库,加到项目中,然后加入openssl库,编写测试代码,编译,报错:XXX not being for architecture i386,感觉是gloox静态库有问题(排除了网上说的头文件路径缺失.building phases没添加.

代码就支持了多线程并发

100行代码就支持了多线程并发,批量写入日志 一,您选择用什么样的日志组件 日志组件,不得不提大名鼎鼎的Log4Net.比较常用的还有 Enterprise Library Logging,ServiceStack Logging.当然您还可以补充,我就只用过这几款. 上边提到的3款日志组件,都要在.config里加代码,特别是Log4Net,还要把SQL写在配置里.我就是仅仅只写个日志,还要配置这么多信息,让人略有不爽. 所以在很长一段时间里,我用下边这个方法写日志:   这个方法足够的简单,

防止 apk反编译 jocky-- java混淆代码 (转至:http://my.oschina.net/f839903061/blog/72554)

1.下载jocky,解压后把整个文件夹复制到Eclipse的plugin目录.2.重启Eclipse,在项目上点右键,如果出现jocky菜单,则安装成功. 3.在项目上点右键,选菜单jocky->jocky setting,弹出菜单后设置如图 4.点ok后,将在项目的根目录下生成一个jocky_build.xml文件,事实上是一个ant build文件.打开这个文件,作适当修改<?xml version="1.0" encoding="UTF-8" st