xcode在用clang编译cairo库的时候出现的error和warning
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xcode在用clang编译cairo库的时候出现的error和warning相关的知识,希望对你有一定的参考价值。
今天我用clang编译ios版本的cairo库时,出现了100+warning和1个error,warning太多了,就不贴了,下面就是那个error,如果在Xcode的项目中,我只要把gnu99改为gnu89运行就ok,但是我在编译时将-std=gnu99改为-std=gnu89是无效的,我在网上也没有找到解答,有大神能够解决一下吗?再就是我明明编译的是iOS的模拟器版本怎么warning中提示时deprecated in os x 10。6是我编译错了,还是正常现象?
还有就是我前面直接编译mac版本的cairo库时时可以的,用find ./ -name '*.a' 命令也提示有libcairo.a静态库,结果到目标目录下只有.la文件,我不知道时没有编译成功,还是其他什么的,这个。la文件有什么用吗?
如果有那个大神曾经编译过iOS的cairo,请多多指导,或者能给我一个编译的方法,或者编译成功的静态库。我在这个上面花了很多时间和精力了,感觉安排进度有点拖了,谢谢大家了。
cairo-quartz-font.c:789:26: error: implicit declaration of function
'FMGetATSFontRefFromFont' is invalid in C99
[-Werror,-Wimplicit-function-declaration]
ATSFontRef atsFont = FMGetATSFontRefFromFont (font_id);
^
cairo-quartz-font.c:790:24: warning: 'CGFontCreateWithPlatformFont' is
deprecated: first deprecated in OS X 10.6 [-Wdeprecated-declarations]
CGFontRef cgFont = CGFontCreateWithPlatformFont (&atsFont);
'FMGetATSFontRefFromFont' is invalid in C99
[-Werror,-Wimplicit-function-declaration]
ATSFontRef atsFont = FMGetATSFontRefFromFont (font_id);
^
cairo-quartz-font.c:790:24: warning: 'CGFontCreateWithPlatformFont' is
deprecated: first deprecated in OS X 10.6 [-Wdeprecated-declarations]
CGFontRef cgFont = CGFontCreateWithPlatformFont (&atsFont);
c 各种编译器(gcc clang)
GCC原名为GNU C语言编译器(GNU C Compiler),因为它原本只能处理C语言。GCC很快地扩展,变得可处理C++。之后也变得可处理Fortran、Pascal、Objective-C、Java、Ada,以及Go与其他语言。
由于GCC已成为GNU系统的官方编译器(包括GNU/Linux家族),它也成为编译与创建其他操作系统的主要编译器,包括BSD家族、Mac OS X、NeXTSTEP与BeOS。
这个软件项目在2005年由苹果电脑发起,是LLVM编译器工具集的前端(front-end),目的是输出代码对应的抽象语法树(Abstract Syntax Tree, AST),并将代码编译成LLVM Bitcode。接着在后端(back-end)使用LLVM编译成平台相关的机器语言 。Clang支持C、C++、Objective C。
LLVM历史
Apple(包括中后期的NeXT) 一直使用GCC作为官方的编译器。GCC作为开源世界的编译器标准一直做得不错,但Apple对编译工具会提出更高的要求。
Apple吸收Chris Lattner的目的要比改进GCC代码优化宏大得多——GCC系统庞大而笨重,而Apple大量使用的Objective-C在GCC中优先级很低。此 外GCC作为一个纯粹的编译系统,与IDE配合得很差。加之许可证方面的要求,Apple无法使用LLVM 继续改进GCC的代码质量。于是,Apple决定从零开始写 C、C++、Objective-C语言的前端 Clang,完全替代掉GCC。
正像名字所写的那样,Clang只支持C,C++和Objective-C三种C家族语言。2007年开始开发,C编译器最早完成,而由于Objective-C相对简单,只是C语言的一个简单扩展,很多情况下甚至可以等价地改写为C语言对Objective-C运行库的函数调用,因此在2009年时,已经完全可以用于生产环境。C++的支持也热火朝天地进行着。
gcc hello.c -o hello
学过编译原理这门课程的同学对下面这副图应该很熟悉,这是经典的编译流程。
下面以GCC编译器为例,GCC作为经典的编译器,自然也是遵循这个教科书流程(实际GCC的处理更复杂点,但本质上是一样的)。我们先简化一下上面这幅图,以中间代码为分界,前面的词法分析、语法分析、语义分析我们把它称之为前端处理,后面的优化和目标代码生成我们称之为后端处理。
试想一下,是否可以为不同的高级语言单独写一个前端,然后为不同的处理器架构单独写一个后端呢?
GCC基本上也是这么实现的,不过不要误会,并没有一个统一的gcc执行程序能够处理如此多的前端和后端,每个语言的编译器都是一个独立的程序(如C语言 的编译器是gcc,C++的编译器是g++),而不同的后端也要对应不同的可执行程序。你可以下载单独的一份GCC源代码,通过不同的configure 来生成自己需要的编译器。
而且,编译器的实现也比上图要复杂的多,前端的主要功能是产生一个可供后端处理的语法树,而语法树结构实际上很难与处理器架构脱钩,这些都是编译器应用中需要解决的问题。
GCC强大的真正原因是什么?是因为它支持了众多的前端和后端吗?这些都不过是一个表象而已。GCC是一款真正自由的编译器,我们可以随时把代码拿过来修 改以实现自己需要的功能。如果你的硬件平台增加了一些指令,而普通的编译器并不能产生这些指令怎么办?在GCC后端添加这些指令吧。如果你觉得C语言用的 不太顺手,想给它添加一些功能怎么办?修改GCC的前端吧。因为有了GCC,我们才拥有这些自由,以及迅速实现自己想法的能力,而这些才是GCC强大背后 的基础。
以上是关于xcode在用clang编译cairo库的时候出现的error和warning的主要内容,如果未能解决你的问题,请参考以下文章