更新到iPhone SDK 4.0后,链接器错误(仅模拟器)与自己的库

更新到iPhone SDK 4.0后,链接器错误(仅模拟器)与自己的库,iphone,xcode,compiler-construction,ios-simulator,ios4,Iphone,Xcode,Compiler Construction,Ios Simulator,Ios4,我最近更新了iPhoneSDK 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 我已经读过其他一些关于类似问题的帖子,比如。

我最近更新了iPhoneSDK 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框架无关,而是与我自己的库有关,因此这里提到的解决方案不适用

该库包含在我的目标的“linkbinary With Libraries”下,库搜索路径正确(在我的项目文件中直接使用XCode和纯文本编辑器进行检查),并正确添加到gcc命令中

我使用iPhone Simulator 3.2作为基本SDK,但SDK 4.0也存在同样的问题。同样,这适用于我的设备目标,但不适用于我的模拟器目标。不过,在我从iPhoneSDK3.2升级到4.0之前,这两个版本都可以使用。我还可以通过创建一个只有一个文件和链接库的新项目来重现这个错误。不过,在我更新XCode和SDK之前,lib应该可以使用simulator 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/sdk中的sdk在每次安装时都会被覆盖。然后我再次尝试重新安装SDK 4.0,出现了与上述相同的错误。我在我的项目中没有做任何更改,始终使用3.2作为基本SDK

因此,问题可能缩小到以下选项:

  • 苹果在模拟器SDK 3.2中更改了导致该问题的内容
  • XCode 3.2.3中的更改会导致该问题
  • 构建我自己的库时错误/缺少编译器标志(但是,这些标志只会导致SDK或IDE更改时出现问题)
我还在/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.2.sdk上为该文件夹的旧版本和新版本创建了一个文件夹diff。事实证明,在“同一”SDK中实际上有一些微小的变化。不过,我仍然认为这是一个IDE/编译器标志问题


有人有什么想法吗?我不想永远坚持3.2…

请确保使用与应用程序相同的基本SDK重新编译库。

我终于能够找出构建库的编译器调用中缺少的标志。因此,为了回答我的问题:如果任何人在将自己的静态库链接到XCode 3.2.3中的目标(使用iPhoneSimulator3.2.sdk或iPhoneSimulator4.0.sdk)时遇到问题,您需要使用以下两个标志构建库:

-fobjc abi版本=2

-传统调度


再次感谢。

另一个想法-这在过去发生在我身上,即使图书馆没有参与


再次检查是否未使用“组文件夹引用”选项导入文件。这似乎让Xcode头疼。(至少在我的情况下是这样。)

当我在项目中使用的“其他链接器标志”下删除类似(-ObjC,-all_load)的标志时,我解决了这个问题。实际上存在-all_load冲突。

谢谢你的回答。我使用相同的基本SDK,所以这似乎不是问题所在。正如在另一个论坛()中所建议的那样,我用XCode而不是命令行构建了我的库,它工作正常。尽管我随后在命令行和XCode中使用了相同的gcc标志,但手动构建的库仍然无法在我的应用程序中使用……我遇到了相同的问题。奇怪的是,它只出现在“发行版”中,也没有出现在“调试”版本中,尽管我在更新到4.0SDK后没有做任何更改。然而,我还没有进一步研究这个问题。