iOS程序集成的第三方库过多时,很容易出现某几个库同时用到了一样的函数库,也就是在你的程序link时会提示duplicate symbol,而重复的符号又不是由你自己程序的代码造成的,也就说没法通过直接修改代码把重复的符号去掉!这样呢,要不就要求第三方库提供方该代码,要不就自己修改第三方库的库文件。第一种方法多少有点无理要求,所以还是直接用第二种方法自己解决了吧,也就是直接修改.a文件或framework里的库二进制文件:
C, C++, Obj-C
在Eclipse CDT项目中使用llvm-clang作为编译器并解决gdb调试不显示变量的问题
用了一段时间的Xcode做Mac OSX, iOS的开发后,深深的体会到llvm clang编译器的速度、人性!于是打算在刚换上的Ubuntu 12.10上也装一个好好研究研究。
装好Eclipse Version: 4.2.2和CDT后,先是发现toolchain里只有gcc,意识到又得去google了,好在很容易的就找到了llvm4eclipsecdt这个Eclipse插件(看下面的项目链接或者直接到Eclipse Marketplace里搜llvm clang就能找到),果断装上之后,开了个新C++项目,随便写了几句build,失败,看了一下找不到clang执行程序,猜想应该是还没装伟大的llvm clang编译器吧,打开Ubuntu软件中心一搜,嘿!还真有,这下省事了,直接装上llvm clang还有一些可选项,再回到Eclipse Build运行,ok,一切正常!可后来发现想运行一下Debug吧,却发现虽然断点可以正常下,单步运行也没什么问题,但视图里的局部变量之类的都没有任何显示,watch也不行,根本找不到symbol… Continue reading…
Mac NSOpenGLView NSOpenGLProfileVersion3_2Core glGetString取GL_EXTENSIONS时返回null
实验NSOpenGLView和NSOpenGLProfileVersion3_2Core时发现通过glGetString取GL_EXTENSIONS时一直返回null,不管是放在prepareOpenGL里还是awakeFromNib里,甚至是drawRect:里都不行。尝试调整NSOpenGLView的layer host或layer backed模式结果也都一样。后来查文档发现说3.0+的profile对glGetString传GL_EXTENSIONS已经被deprecated,属于invalid enumeration,正确的方法是用glGetStringi代替:
GLint n, i;
glGetIntegerv(GL_NUM_EXTENSIONS, &n);
for (i = 0; i < n; i++) {
printf("%s\n", glGetStringi(GL_EXTENSIONS, i);
}
另外NVidia Cg的cgGLGetLatestProfile也一直返回Unknown,怀疑和这个性质类似……
UPDATE1:换回NSOpenGLProfileVersionLegacy后,cg问题解决,看来现在的cg sdk还不支持3.0+的profile。
iOS的UDID废用以及UUID配合keychain的替换方案实现
首先,简单介绍一下UDID这个东西:
UDID是Unique Device Identifier的简称,也就是唯一设备标识的意思。于iOS SDK中取得的方法是UIDevice的一个叫uniqueIdentifier的NSString*,由于这个ID字符串是基于设备的,应用开发人员可以通过获取此ID来用于记录区分设备。正是由于这个特性,可能会导致一些隐私等等相关的问题,Apple于iOS5中将这个UDID废掉了,SDK中被标记为了Deprecated,虽然为了兼容低版本的源代码而继续存在,但并不会再返回任何有实际意义的东西。
最近在做Flurry的统计功能时,发现还是需要用到可以识别设备的东西的,好方便分析数据,经过一段时间的研究、试验,发现了这个应该还算是比较靠谱的方法……
在Mac OSX下编译用于iOS的FreeType静态库
记得上学的时候自己研究DirectDraw的文字绘制时,曾经用过FreeType开源库做过一些简单的TTF字库文字绘制操作,那时没什么强力CPU、GPU,而且又是用的DirectDraw,Alpha混合这种操作都是CPU计算,量稍微大一些的时候FPS是相当的不尽人意,就算做了MMX、SSE等的SIMD优化,感觉也不是很理想,而FreeType画文字没有半透明的抗锯齿的话效果也不是很好,所以当时就留下个印象:FreeType的确是非常强力的文字绘图解决方案。现在在像iOS、Android等移动设备的硬件都已经相当强大了(相对而言),所以我又忍不住想要继续一下当年的小研究了!
首先,先做好准备工作。因为是在Mac下编译,所以Xcode是必不可少的,这里需要注意一点,最近的某个版本(好像是4.3)开始Xcode被变成了独立app的形式发布,而这个默认是不带command line tools,而我们要做的FreeType编译是需要用到make等命令行工具的,所以进入Preferences->Downloads里把它下载下来吧,相对1.6G的Xcode来说,180M的命令行工具应该没什么痛苦。
[ZT]关于VS2010的调试信息即.pdb文件3DS MAX FBX SDK Samples
在运行FBX的sample程序时发现提示:debug information of xxx.exe cannot be found or not match ,于是首先在网上找了下相关资料,得到如下建议:
又是wchar_t的问题,这次是Apple LLVM compiler 3.0的bug!
之前发现过Android上NDK对wchar_t以及相关函数的支持不足问题,后来又发现过iOS上类似的setlocale问题。最近在更新了Xcode 4.2以后,发现之前用的wchar_t相关的东西都不对了,wcslen函数返回的字符串长度不对,而且在gdb中用p查看const wchar_t*变量时,显示的是const void*,貌似就没有wchar_t相关的东西。
这个问题如果切换编译器为之前的LLVM GCC编译器则一切正常,浪费了很多时间排查错误,最后发现更新了最近的Xcode 4.3(4E109)带的Apple LLVM compiler 3.1就没问题了。啊!原来是3.0的BUG。
MotoDroid的glTexSubImage2D作用贴图尺寸问题
之前用MotoDroid机器的时候曾经发现过一个比较恶心的事,就是glGenTextures函数生成的贴图ID是乱数的问题,后来发现GL官方也说不保证此函数返回值是连续正整数,也就罢了。这次又发现MotoDroid上的glTexSubImage2D函数问题,就是在获取gl信息中的最大贴图尺寸时,ME525和Milestone2都返回2048×2048(其它机型未测),但在贴图尺寸为2048×2048的时候调用glTexSubImage2Dj局部更新贴图时,会出现错误覆盖贴图已有内容的问题,而将贴图尺寸降为1024×1024后就不会出现这种问题了。
