尝试用Xcode 14.2 编译Unity 4.7导出项目

发布时间 2023-09-06 18:01:19作者: opencoder

在Windows10上用Unity4.7导出项目,然后拷贝到MacMini上用XCode14.2编译构建项目。尝试下发现有不少问题,最后没有能成功打包。走过路过的高手,知道这其中缘由的还请指教下,不胜感激!

libstdc++.a 库文件缺失

库文件缺失,解决办法:用Xcode 9.3版本补充即可,参考链接(https://zhuanlan.zhihu.com/p/62720481
将 libstdc++6.0.9等静态库文件复制到: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib
将4.2.1 头文件 复制到: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/c++
然后在XCode中引入libstdc++6.0.9 等静态库文件 即可。

链接错误 Undefined symbols:"UnityKeyboard_GetText(std::string*)"

尝试方法 1)

找到项目源码中的 UnityKeyboard_GetText(std::string*) 定义处,添加前缀 extern "C",行不通

尝试方法 2)

在Xcode中新建一个静态库,在其中导出 UnityKeyboard_GetText(std::string*),行不通

上述两个方法,共同提示为找到 _UnityKeyboard_GetText(std::string*),并提示添加 extern "C" 前缀,貌似新版的Xcode的 Name Mangling 机制改了?

用Xcode 14.2新建一个静态库工程,定义并导出函数 extern "C" void UnityKeyboard_GetText(std::string*),用IDA查看其导出函数名为 _UnityKeyboard_GetText(std::string*)

查看unity2017项目的相关代码,左边为工程源码,右边为 IDA显示出来的 iPhoneInputImpl.o 的导入符号表,这个是什么鬼?不是说好了 extern “C” 是保留原符号名么? 怎么。。。。。。iPhoneInputImpl

尝试方法3)

有了上面的观察结果,于是修改 iPhoneKeyboard.o 中的导入符号表呢? 把 UnityKeyboard_GetText(std::string*) 修改为 _nityKeyboard_GetText(std::string*),项目原代码也作相关的调整,该方法也行不通!

网络搜索一番关于Xcode的 Name Mangling 机制的相关内容,未找到有用的解决办法。unity4.7的项目在Xcode 9/ Xcode 10/ Xcode 11上都是可以编译成功的。搞不懂是新版XCode什么设置所导致的! 一番尝试未果,暂时选择了放弃!走过的小伙伴们有知道原因的,还麻烦您留个言告知一二,不胜感激!