引擎设计跟踪: 为什么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 ...
随机推荐
- windows环境下python编码问题
log.info(unicode(str"你好" + "aaa")) 或 Log.info(u"你好111111111111111111111111& ...
- python简单爬虫 使用pandas解析表格,不规则表格
url = http://www.hnu.edu.cn/xyxk/xkzy/zylb.htm 部分表格如图: 部分html代码: <table class="MsoNormalTabl ...
- Git设置旧邮箱与现邮箱不一致问题
设置名字和邮箱git config user.name 'lhr' git config user.email 'lhr@qq.com' 工程根目录创建email.sh文件粘贴以下代码 #!/bin/ ...
- RAID阵列盘有一块状态变为外来处理方法
感谢: https://blog.csdn.net/cmzsteven/article/details/63680933
- 《JavaScript Dom 编程艺术》读书笔记-第10章
用JS实现动画~内容包括: 1. 动画基础知识 2. 用动画丰富网页的浏览效果 动画就是让元素的位置随时间而不断变化. 位置: //CSSelement{ position:absolute; top ...
- Problem 4: Largest palindrome product
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2 ...
- Codeforces Round #552 (Div. 3) F. Shovels Shop (前缀和预处理+贪心+dp)
题目:http://codeforces.com/contest/1154/problem/F 题意:给你n个商品,然后还有m个特价活动,你买满x件就把你当前的x件中最便宜的y件价格免费,问你买k件花 ...
- 用Spring Boot去创建web service
1. 环境 JDK1.8 JavaSE1.8 web容器是 webSphere IDE是Eclipse 2. 创建一个空的 Maven Project 3. 打开pom.xml 配置相应的packag ...
- SQLServer存储过程批量删除
create proc [dbo].[proc_Delete]@TableName varchar(50),@Id varchar(5000)asbegin declare @strSql varch ...
- js 回调函数理解
function A(callback) { console.log('我是主函数'); setTimeout(function () { callback("我是主函数传出的") ...