Xmake基础----跨平台开发介绍

如果 C/C++ 项目在开发和构建中要考虑跨平台问题,需要同时支持 Linux、macOS 和 Windows 系统,甚至还要支持 Android 和 IOS 等移动端系统,那么我们需要考虑很多跟平台相关的一些差异化因素,才能支持跨平台,其涉及并需要解决的一些平台差异有如下这些。

  1. 代码差异,比如依赖的系统库 API 不同,不同编译器对 C++ 标准的支持力度不同。
  2. 编译工具链的差异,以及对应的编译器特性、编译选项差异。
  3. 运行时环境的差异。

抛开运行环境不谈,如果要在不同平台提供的编译工具链上通过编译,首先要解决代码自身支持跨平台的问题,然后不同的工具链、系统提供的 API 接口各不相同,很难能保证写一份代码,随处编译。

即使有 posix 接口、libc 库接口等保证一定程度上调用的 API 是跨平台的,但实际上不同平台对这些接口的支持力度都各不相同,就拿 strncasecmp 接口来说,gcc 和 clang 编译器通常都会提供,但是对于 msvc 编译器,是没有这个接口,只提供了等价的 _strnicmp 接口。

这个时候,如果我们要支持跨平台编译和运行,那么就需要在代码中判断当前的编译器和工具链是否提供了这个接口,如果有就调用,没有就用其它解决方案,例如。

#ifdef _MSC_VER
    _strnicmp(s1, s2, n);
#else
    strncasecmp(s1, s2, n);
#endif

但是这样还是不可靠的,因为我们不能保证 msvc 的所有版本都提供了 _strnicmp 接口,有可能老版本里面也没这个接口,同时也不能保证所有 gcc 和 clang 的工具链都提供了 strncasecmp,有些嵌入式系统的交叉编译工具链为了精简,可能会去掉部分 libc 接口也是有可能的。

因此,单纯的判断编译器是不行的,我们应该直接检测当前使用的编译工具链里面有没有这个接口,如果有就用,没有就不去用它。但是,这种检测在代码中通过宏是完成不了的,这时候就需要构建工具去提供支持才行。

例如,我们在编译的时候,构建工具先自动检测当前的编译工具链里面是否能够正常使用 _strnicmp 接口,如果检测通过,那么可以自动给编译器传递一个宏定义,例如 HAVE_STRNICMP,这样就可以在代码中进行更准确的判断处理。

#if defined(HAVE_STRNICMP)
    _strnicmp(s1, s2, n);
#elif defined(HAVE_STRNCASECMP)
    strncasecmp(s1, s2, n);
#else
#    error "not supported"
#endif

上述的代码判断逻辑已经相对比较可靠,也已经能很好的处理跨平台了。如果当前编译器没提供对应接口,我们要么直接报错、提示不支持,要么可以自己实现这个接口把它支持上。

因此,为了让大家更方便的处理跨平台,xmake 内置提供了各种便于检测的配置接口,方便用户定制化配置检测编译器特性、头文件、接口、库、类型等支持力度,下面我们会逐一详细讲解如何去配置 xmake.lua 来实现跨平台特性检测。

配置库头文件检测

先从最简单的例子开始,假设

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红星星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值