【问题标题】:XCode Update - iOS Link ErrorXCode 更新 - iOS 链接错误
【发布时间】:2011-09-27 20:45:51
【问题描述】:

我刚刚将我的项目从 Xcode 3 转换为 4 并更新到最新的 SDK。项目在 XCode 3 中打开时运行良好,但在 XCode 4 中运行时出现错误。

我收到以下链接错误:

Undefined symbols for architecture armv7:
  "_objc_memmove_collectable", referenced from:
      __ZN9cPlaylistaSERKS_ in MediaItemManager.o
ld: symbol(s) not found for architecture armv7

从我读到的关于 memmove_collectable 的内容来看,它与垃圾回收内存周围的守卫有关。但是在我的项目设置中设置为:

Obj-C Garbage Collection - Unsupported

我什至不确定 iOS 中是否有垃圾收集。有谁知道我可能做错了什么?

一些帮助消除名称也会很棒。我的 MediaItemManager 是一个 C++ 类,它确实调用了 new/delete 和 memset/memcpy。但是,它们都不在名为 Playlists 的函数中。这是 MediaItemManager 中的 evertying,其中包含单词 Playlist。 cPlaylist 不调用 memset/memcpy 函数。

cPlaylist* AllSongsPlaylist() { return mSongList; }
pPlaylistVec Playlists() { return &mPlaylists; }
cPlaylist* PlaylistByIndex(uint32 idx);
cPlaylist* PlaylistByName(NSString* name);

...

    std::vector<cPlaylist> mPlaylists;

    typedef std::vector<cPlaylist>*                   pPlaylistVec;

编辑: 它似乎发生在 armv7 或 armv6 上。这可能是 XCode 的安装问题,但我不确定 XCode 安装应该是什么样子。我确实必须添加这个符号链接才能在安装后构建 XCode。 iPhone Codesign object file format invalid or unsuitable

【问题讨论】:

    标签: iphone ios xcode linker garbage-collection


    【解决方案1】:

    所以你可能会讨厌这个,因为它需要一个小时左右,但我对这些链接器错误所做的就是完全卸载 xcode,然后重新启动重新安装 xcode 并重新启动。通常这就是问题所在,因为在不卸载 xcode 3 的情况下安装 xcode 3 然后再安装 xcode 4 通常会导致巨大的问题。所以你将不得不去终端和 cd 到你的开发者文件夹和 sudo /Library/uninstall-devtools --mode=all sorry man :( 希望这会有所帮助。

    【讨论】:

    • 我不太确定...您可以在单独的目录中并排安装多个 Xcode 版本,只要您始终安装较新的版本。 (您不能先安装 X 版,然后再安装 X-1;那会搞砸了。)安装程序允许您选择备用位置。 “新”基于 App Store 的安装程序将 /Developer 移到一边(将其重命名为 /Developer-x.y.z,x.y.z 是以前安装的版本号)并在 /Developer 中重新安装)。
    • 你是对的,马克,这确实奏效了。安装过程中一定发生了一些奇怪的事情。
    【解决方案2】:

    我假设您的 C++ 代码在库中。你重建图书馆了吗?

    该错误表明您的库需要重建,因为它不包含 armv7 符号,正如错误所暗示的那样。换句话说,它不是一个通用库。您需要重新构建该库,或者将您的主项目更改为仅针对 armv6 构建。

    值得注意的是,Xcode4 默认只为 armv7 构建。如果要支持 4.2 之前的 iOS4 版本,则必须在构建设置中将 armv6 添加到支持的架构中。并且,您必须相应地重建任何依赖库。

    这有意义吗?

    【讨论】:

    • 我现在没有将它设置为库,只是一个包含在其他 obj-c 类中的 C++ 类。我将项目切换为仅使用 armv6。我从 Valid Archs 中删除了 armv7,并将 Archs 从 $(ARCHS_STANDARD_32_BIT) 更改为 armv6。我仍然遇到类似的错误,只是现在使用 armv6。
    • 嗯...好吧,我没有尝试将 C++ 与 Objective-C 混合,尽管我已经使用 C 这样做了。我想知道 C++ 名称修改是否是问题。您可能必须为 C++ 设置一些编译器标志,以便名称不会被破坏,这将允许链接器解析所述名称。您可能必须为您的 C++ 方法编写 C 包装器,尽管这似乎是一种 hack。
    猜你喜欢
    • 2013-01-20
    • 2019-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多