我最近更新到 iPhone SDK 4.0,无法再为 iPhone 模拟器构建项目。问题是 ld 无法再找到我自己的库之一的类:
"_OBJC_CLASS_$_Book", referenced from:
objc-class-ref-to-Book in Category.o
(maybe you meant: ...)
ld: symbol(s) not found
collect2: ld returned 1 exit status
我已经阅读了一些有关类似问题的其他帖子,例如这里。 “不幸的是”,我的问题与SDK框架无关,而是与我自己的lib有关,所以那里提到的解决方案在这里不适用。
该库包含在我的目标的“Link Binary With Libraries”下,库搜索路径正确(使用 XCode 和直接在我的项目文件中使用纯文本编辑器检查)并正确添加到 gcc 命令中。
我使用 iPhone Simulator 3.2 作为 Base SDK,但 SDK 4.0 也会出现同样的问题。同样,这适用于我的设备目标,但不适用于我的模拟器目标。不过,在我从 iPhone SDK 3.2 更新到 4.0 之前,两者都可以使用。我还可以通过创建一个仅包含一个文件和链接库的新项目来重现此错误。但是,该库应该没问题,因为在我更新 XCode 和 SDK 之前它可以与模拟器 3.2 一起使用。
更多事实:Mac OS X 10.6.3、XCode 3.2.3 64 位、iPhone OS 3.2、GCC 4.2
任何帮助将不胜感激。
编辑:
重新安装 SDK 3.2 后,一切再次按预期运行。必须注意的是,文件夹 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs 中的 SDK 在每次安装时都会被覆盖。然后我尝试再次重新安装 SDK 4.0,并出现与上面相同的错误。我没有更改项目中的任何内容,并且始终使用 3.2 作为 Base SDK。
因此,问题可能会缩小到以下选项:
我还在 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.2.sdk 上对该文件夹的旧版本和新版本进行了文件夹差异。事实证明,“相同”的 SDK 中实际上存在一些细微的变化。不过,我仍然认为这是 IDE/编译器标志问题。
有人有什么想法吗?我不想永远坚持3.2...
确保使用与应用程序使用的相同的基础 SDK 重新编译库。
我终于能够找出构建我的库的编译器调用中缺少哪些标志。因此,要回答我的问题:如果有人将自己的静态库链接到 XCode 3.2.3 中的目标(使用 iPhoneSimulator3.2.sdk 或 iPhoneSimulator4.0.sdk)时遇到问题,您需要使用以下内容构建您的库两面旗帜:
-fobjc-abi-版本=2
-fobjc-遗留-调度
再次感谢PhoneyDeveloper的提示。
另一个想法 - 这在过去发生在我身上,即使图书馆没有参与。
仔细检查您是否未使用“组文件夹引用”选项导入文件。 看来这让Xcode很头疼。 (至少在我的例子中是这样。)
当我删除我在项目中使用的“其他链接器标志”下的(-ObjC,-all_load)等标志时,我解决了这个问题。实际上存在 -all_load 冲突。