引擎设计跟踪: 为什么Blade可以用Clang编译
最近在使用VS2015 Community, 在添加了shared items project, 并把源代码加入shared items, 添加Android工程编译的时候, 发现可以用Clang正常编译(VS2015默认使用自带的Clang编译器来编译安卓).
一开始并没有多想, 后来在准备添加Clang支持的时候, 突然意识到, Blade并没有做Clang编译器的支持, 但是可以正常编译!
最后发现, Clang也定义了__GNUC__, 编译的时候就当做GCC编译了.
相关搜索如下:
http://rem.eifzilla.de/archives/2012/08/10/identify-theft-by-clang
其中第一个链接, 有人提出该问题, Clang的贡献者出来说这是个已知问题, 但问题是__GNUC__只是表示编译器支持GNU扩展, 而不是说编译器一定是GCC, 比如ICC(Intel)也可以定义这个宏定义.
原因在于GCC只提供了extension检查而没其他定义可以区分编译器.
为了防止Clang编译器需要特殊处理, 所以还是需要加上Clang支持, 所以Blade的代码现在如下:
#if defined(_MSC_VER)
# define BLADE_COMPILER BLADE_COMPILER_MSVC
#elif defined(__clang__)
//note: Clang also defines (__GNUC__), so we need detect Clang first, or it will be mistaken as GCC
# define BLADE_COMPILER BLADE_COMPILER_CLANG
# define BLADE_COMPILER_GNU_EXTENSION
#elif defined(__GNUC__)
# define BLADE_COMPILER BLADE_COMPILER_GNUC
# define BLADE_COMPILER_GNU_EXTENSION
#else
# error Compiler not supported yet.
# define BLADE_ALWAYS_INLINE inline
#endif #if BLADE_COMPILER == BLADE_COMPILER_MSVC
# define BLADE_ALIGNED(n) __declspec(align(n))
# define BLADE_CDECL __cdecl
# define BLADE_STDCALL __stdcall
# define BLADE_FASTCALL __fastcall
# define BLADE_FUNCTION __FUNCTION__
# define BLADE_ALWAYS_INLINE __forceinline
#elif BLADE_COMPILER_GNU_EXTENSION
# define BLADE_ALIGNED(n) __attribute__((aligned(n)))
# define BLADE_CDECL __attribute__((cdecl))
# define BLADE_STDCALL __attribute__((stdcall))
# define BLADE_FASTCALL __attribute__((fastcall))
# define BLADE_FUNCTION __PRETTY_FUNCTION__
# define BLADE_ALWAYS_INLINE __attribute__((always_inline))
#else
# error Compiler not supported yet.
#endif
对于支持GNU扩展的编译器, 必须要在检测GNU之前检测, 否则会被误认为GCC编译器.
也就是添加了CLANG编译器, 但是对于支持GNU Extension的编译器, 单独有统一的处理. 通常情况下, 只需要使用BLADE_COMPILER_GNU_EXTENSION就可以使用GCC和CLANG和其他支持GNU Extension的编译器,
除非真的要用到Clang的特性或者需要针对Clang进行特殊fix, 才会使用BLADE_COMPILER_CLANG.
引擎设计跟踪: 为什么Blade可以用Clang编译的更多相关文章
- 引擎设计跟踪(九.14.2a) 导出插件问题修复和 Tangent Space 裂缝修复
由于工作很忙, 近半年的业余时间没空搞了, 不过工作马上忙完了, 趁十一有时间修了一些小问题. 这次更新跟骨骼动画无关, 修复了一个之前的, 关于tangent space裂缝的问题: 引擎设计跟踪( ...
- 引擎设计跟踪(九.14.3.4) mile stone 2 - model和fbx导入的补漏
之前milestone2已经做完的工作, 现在趁有时间记下笔记. 1.设计 这里是指兼容3ds max导出/fbx格式转换等等一系列工作的设计. 最开始, Blade的3dsmax导出插件, 全部代码 ...
- 引擎设计跟踪(九.14.2 final) Inverse Kinematics: CCD 在Blade中的实现
因为工作忙, 好久没有记笔记了, 但是有时候发现还得翻以前的笔记去看, 所以还是尽量记下来备忘. 关于IK, 读了一些paper, 觉得之前翻译的那篇, welman的paper (http://gr ...
- 引擎设计跟踪(九.14.2i) Android GLES 3.0 完善
最近把渲染设备对应的GLES的API填上了. 主要有IRenderDevice/IShader/ITexture/IGraphicsResourceManager/IIndexBuffer/IVert ...
- 引擎设计跟踪(九.14.2f) 最近更新: OpenGL ES & tools
之前骨骼动画的IK暂时放一放, 最近在搞GLES的实现. 之前除了GLES没有实现, Android的代码移植已经完毕: [原]跨平台编程注意事项(三): window 到 android 的 移植 ...
- 引擎设计跟踪(九.14.2j) TableView工具填坑以及多国语言
Blade的UI都是预定义的接口, 然后由插件来负责实现, 目前只有MFC的插件. 最近加上了TableView的视图, 用于一些文件的查看和编辑, 比如前面在文件包的笔记中提到需写一个package ...
- 引擎设计跟踪(九.14.2g) 将GNUMake集成到Visual Studio
最近在做纹理压缩工具, 以及数据包的生成. shader编译已经在vs工程里面了, 使用custom build tool, build命令是调用BladeShaderComplier, 并且每个文件 ...
- 引擎设计跟踪(九.14.2d) [翻译] shader的跨平台方案之2014
Origin: http://aras-p.info/blog/2014/03/28/cross-platform-shaders-in-2014/ 简译 translation: 作者在2012年写 ...
- 引擎设计跟踪(九.14.2b) 骨骼动画基本完成
首先贴一个介绍max的sdk和骨骼动画的文章, 虽然很早的文章, 但是很有用, 感谢前辈们的贡献: 3Ds MAX骨骼动画导出插件编写 1.Dual Quaternion 关于Dual Quatern ...
随机推荐
- spark中map与flatMap的区别
作为spark初学者对,一直对map与flatMap两个函数比较难以理解,这几天看了和写了不少例子,终于把它们搞清楚了 两者的区别主要在于action后得到的值 例子: import org.apac ...
- SQL求几何重心
ST_Centroid(geometry); geometry :a specified ST_Geometry e.g.: select ST_AsText(ST_Centroid('0103000 ...
- Python之file方法
def fileno(self): # 文件描述符 def flush(self): # 刷新文件内部缓冲区 def isatty(se ...
- GUI开发:实时显示摄像头图像
import tkinter as tk from PIL import Image, ImageTk import cv2 import numpy as np import time g_exit ...
- java proxy 转包
package org.rx.socks.proxy; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; ...
- java往MongDB导入大量数据
好几月没写博客了~~~ --------------------- 在公司最近在搞用java往MongDB导入数据 现在是我刚导入2000W条数据了 所以就先写上吧,废话也不多说了 MongDB 我本 ...
- CG-ctf WP
week one 1 /x00 提示:有多种解法,你能找到几种 源码: writer up: 题目直接给出了源码,get 到一个 nctf 这个变量,int ereg(string pattern, ...
- Groovy学习笔记-使用多赋值
1.方法返回多个结果:返回数组,将多个变量逗号隔开,放在左侧圆括号中 def splitName (fullName) { fullName.split(' ') } def (firstName, ...
- Real time profiler for Delphi applications
xalion提供的资源,这么强,还是免费的,快去试用! ✓ Detailed debug information (internal, TDS, MAP) ✓ Display informat ...
- 蓝屏代码PAGE_FAULT_IN_NONPAGED_AREA的解决方法
就在昨天晚上,小王同学的电脑继1803更新后第4次蓝屏了,原本蓝屏后自动重启后就会恢复正常,然而天真的我太低估了微软的实力.蓝屏-重启-蓝屏-重启无限循环 当然,重启几次就进入了高级模式 高级模式 进 ...