记录 iOS 开发过程中遇到的各种操蛋问题
Undefine symbols for architecture XXX

Update: 20161014

  1. 检查工程文件目录里面是否确实引入了相关的库
  2. 检查工程的 Linked Frameworks and Libraries 是否引入相应的 lib
  3. 检查 Library search path 是否设置正确
Xcode8.x 安装 XVim 之后闪退,错误提示信息为关于签名

Update: 20160908
提示的 Exception 类型为:

1
Exception Type: EXC_BAD_ACCESS (Code Signature Invalid)

Xcode8 安装 XVim 的时候会将签名去除掉,Xcode 无法对自身进行验证。解决方法是用自己的证书为 Xcode 重新签名。在 XVim 的 issues979 下可以看到另一个简便的解决方法, 不过我还没实践过:
89159fix_xcode8.png
如果采用自己证书重签名:

1
codesign -f -s <证书ID> Xcode.app

运行之后终端可能会假死一段时间,只要等就好了。假如等待之后得到一个错误 unable to find utility "codesign_allocate", 可以尝试一下这里提到的解决方法:

1
locate codesign_allocate

如果你没有生成相应的数据库,就按照提示去生成。完成之后再次运行上面的命令,会输出一堆路径。其中应该也会包含下面这个路径:

1
/Library/Developer/CommandLineTools/usr/bin/codesign_allocate

将它添加到 PATH 变量中。当然这里应该是任一个路径都可以。在 ~/.zshrc(如果你没有使用 zsh,那就是 ~/.bashrc) 中添加:

1
export PATH=$PATH:/Library/Developer/CommandLineTools/usr/bin/codesign_allocate

然后创建一个软链到 /usr/bin/ 中:

1
sudo ln -s /Library/Developer/CommandLineTools/usr/bin/* /usr/bin/

之后再签名应该就没问题了。

iOS10.0 & Xcode8 beta 6, 工程 demo 无法访问网络

一开始工程使用的签名配置是团队名称 + 自动选择,后来手动指定了 provisioning 文件,就可以了。原因暂时有待查明。

pod install 时提示报错 Unable to find a specification

image


而工程的 podfile 中对这个仓库是这样指定的:

1
pod 'WebViewJavascriptBridge', :git => 'https://github.com/gzkiwiinc/WebViewJavascriptBridge.git', :branch => 'master'


于是查了一下公司维护的自有版本仓库根目录下的 podspec 文件。要提一下的是,根据 cocoapods 文档,如果采用另外指定 source repo 的方式,那么 repo 的根目录下必须有一个 valid 的 podspec file:


image


clone 到本地之后用 pod spec lint 检查一下 podspec 文件是否正确,结果报了一个错:


image


看起来应该是 cocoapods 1.0.0 中废弃了这个旧的语法。修改成下面这样:

1
s.platforms = { :ios => "5.0", :osx => "" }


修改完成提交之后,发觉仍然报错 Unable to find a specification,仔细瞧了一下 log,指向的 commit 是并不是 master 分支上最新的 commit:

1
Pre-downloading: `WebViewJavascriptBridge` from `https://github.com/gzkiwiinc/WebViewJavascriptBridge.git`, commit `f5e92dd1d49c67724719491ae0f7696026dff9c1`

而 podfile 中的声明并没有问题。没时间折腾了,只好强行指定一个 commit:

1
pod 'WebViewJavascriptBridge', :git => 'https://github.com/gzkiwiinc/WebViewJavascriptBridge.git', :branch => 'master', :commit => 'xxxxx'


最后再 pod install,就跑通了。


总结:不要忽略官方文档,靠猜不如看文档。另外还有一个问题,为什么指定的 master 分支没有取到最新的提交

cocoaPods 提示 diff: /../Podfile.lock: No such file or directory

因为我刚刚将 podfile 修改了,增加了一些 target 指定。重新 pod install 之后会生成新的配置文件,而原来的配置文件会被删除。但是 cocoaPods 没有帮忙正确设置回来。pod install 的时候终端也有输出警告信息:


image


在工程目录中找到 Pods 文件夹,在 Target Support Files 文件夹中找到为各个 Target 生成的配置文件,将其重新引入工程:


image


在项目的 info 中将新的设置文件引入


image


问题就消失了

提示错误 ld: library not found for -lPods

同上,原因是:项目中增加了一个 Target,重新对 pod 增加了一些 pod target 的指定。重新 build 之后原来的库 libPods.a 会被删除。
解决方法说来也简单,直接在 Xcode 里将项目中对被删除的 .a 文件的引用删掉即可(红色)。说起来真是羞愧,一直没有注意到这点,Xcode 会对项目中引用的文件进行引入。如果缺失的图片资源那还好办,只会报一个警告;如果缺失的是库文件,直接编译不通过。


顺便一提,libPods-XXX.a 文件目录是在:

1
/Users/用户名/Library/Developer/Xcode/DerivedData/项目名/Build/Products/Debug-iphonesimulator/libPods-XXX.a