【问题标题】:iOS SDK 5.1 linker error for non_lazy_ptr in Xcode 4.4.1Xcode 4.4.1 中 non_lazy_ptr 的 iOS SDK 5.1 链接器错误
【发布时间】:2012-08-14 11:15:27
【问题描述】:

(我在 VideoLAN 论坛上发布了这个问题,但还没有接受者。我知道 SO 社区不会让我失望。)

我正在尝试为 iOS 构建 MobileVLC 项目。我已经完成了命令行过程来构建项目,经过http://forum.videolan.org/viewtopic.php?f=12&t=103331http://forum.videolan.org/viewtopic.php?f=12&t=103271 中描述的一些调整后,构建脚本几乎运行完成。当它试图让 Xcode 构建最终项目时,它会出错。所以我将它加载到 Xcode 并尝试构建,我可以看到错误,这是我使用 -v 链接器标志时得到的:

Ld /Users/bp/Library/Developer/Xcode/DerivedData/MobileVLC-ctcjnpeqzuhulxcmjlhrjnyzpzil/Build/Products/Debug-iphoneos/VLC.app/VLC normal armv7
    cd /Users/bp/Desktop/vlc/MobileVLC
    setenv IPHONEOS_DEPLOYMENT_TARGET 5.1
    setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -L/Users/bp/Library/Developer/Xcode/DerivedData/MobileVLC-ctcjnpeqzuhulxcmjlhrjnyzpzil/Build/Products/Debug-iphoneos -L/Users/bp/Desktop/vlc/MobileVLC/External/MobileVLCKit -L/Users/bp/Desktop/vlc/MobileVLC/External/MediaLibraryKit -F/Users/bp/Library/Developer/Xcode/DerivedData/MobileVLC-ctcjnpeqzuhulxcmjlhrjnyzpzil/Build/Products/Debug-iphoneos -filelist /Users/bp/Library/Developer/Xcode/DerivedData/MobileVLC-ctcjnpeqzuhulxcmjlhrjnyzpzil/Build/Intermediates/MobileVLC.build/Debug-iphoneos/MobileVLC.build/Objects-normal/armv7/VLC.LinkFileList -dead_strip -Wl,-no_pie,-v -fobjc-link-runtime -miphoneos-version-min=5.1 -framework Foundation -framework UIKit -framework CoreGraphics -framework OpenGLES -framework AudioToolbox -framework QuartzCore -liconv -lz /Users/bp/Library/Developer/Xcode/DerivedData/MobileVLC-ctcjnpeqzuhulxcmjlhrjnyzpzil/Build/Products/Debug-iphoneos/libMobileMediaLibraryKit.a -lsqlite3 -lstdc++.6 -lbz2 -lxml2 -framework CoreData -framework CoreText -framework MediaPlayer /Users/bp/Library/Developer/Xcode/DerivedData/MobileVLC-ctcjnpeqzuhulxcmjlhrjnyzpzil/Build/Products/Debug-iphoneos/libMobileVLCKit.a -o /Users/bp/Library/Developer/Xcode/DerivedData/MobileVLC-ctcjnpeqzuhulxcmjlhrjnyzpzil/Build/Products/Debug-iphoneos/VLC.app/VLC

@(#)PROGRAM:ld  PROJECT:ld64-133.3
configured to support archs: armv6 armv7 i386 x86_64
Library search paths:
   /Users/bp/Library/Developer/Xcode/DerivedData/MobileVLC-ctcjnpeqzuhulxcmjlhrjnyzpzil/Build/Products/Debug-iphoneos
   /Users/bp/Desktop/vlc/MobileVLC/External/MobileVLCKit
   /Users/bp/Desktop/vlc/MobileVLC/External/MediaLibraryKit
   /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/usr/lib
Framework search paths:
   /Users/bp/Library/Developer/Xcode/DerivedData/MobileVLC-ctcjnpeqzuhulxcmjlhrjnyzpzil/Build/Products/Debug-iphoneos
   /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/
LLVM version 3.1svn, from Apple Clang 4.0 (build 421.0.60)
ld: 'non_lazy_ptr' in /Users/bp/Library/Developer/Xcode/DerivedData/MobileVLC-ctcjnpeqzuhulxcmjlhrjnyzpzil/Build/Products/Debug-iphoneos/libMobileVLCKit.a(libdeinterlace_plugin_la-deinterlace.o) contains undefined reference for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

据我所知,libMobileVLCKit.a 文件已链接到 MobileVLC 项目,所以我不确定接下来要查找什么,因为我在任何代码中都找不到对 non_lazy_ptr 的任何引用,并且框架引用了所有看起来不错。即使您不知道解决方案,任何关于在哪里寻找问题的想法都将不胜感激。谢谢。

编辑:这是一个屏幕截图,显示了 MobileVLC 项目的“构建阶段”选项卡中的所有内容。

编辑 2:我在 VideoLAN 论坛上的帖子得到了一些“我也是”的回复,以及一个与其他用户的错误非常相似的错误。这是错误消息的最后一行:

ld: '_AmplifyFloat' in /Users/**/MobileVLC/ImportedSources/VLCKit/build/Release-iphoneos/libMobileVLCKit.a(libvolume_neon_plugin_la-volume.o) contains undefined reference for architecture armv7

这是 VideoLAN 论坛上的帖子:http://forum.videolan.org/viewtopic.php?f=12&t=103433

编辑 3:我从 VideoLAN 的 git 存储库中获取了一份新的源代码副本,并查看了 user1071136 在下面提供的答案,最终得到了与他们得到的完全相同的错误。

我在 Stack Overflow 上发现了一个类似的错误,表明解决方案是检查以确保 Apple LLVC compiler 4.0 - Code Generation 构建设置中的 Generate Position-Dependent Code 选项设置为否。但像往常一样尝试让 VLC 运行iOS,这也是一个死胡同,因为构建设置已经设置为否。

这是该问题和答案的链接:(null): In section __TEXT,__text reloc 3: section For Address(0x7C6C) address not in any section for architecture armv7

【问题讨论】:

  • 库文件上的 ranlib -c 可能会解决此问题。您还可以检查目标的框架搜索路径。我不是专业人士,但我认为这些可以帮助你。
  • 我在派生文件位置的 libMobileVLCKit.a 文件上执行了 ranlib 命令,它只是返回了一堆关于如何没有符号的行。另外,我检查了 MobileVLC 项目和 MobileVLCKit 项目中的目标框架搜索路径,它们都是空白的。
  • 我的一位同事发现了同一问题的最近链接,但我仍然不确定我应该寻找什么:comments.gmane.org/gmane.comp.video.videolan.vlc.devel/87906

标签: ios xcode linker vlc


【解决方案1】:

我未能成功构建它,但我克服了一些可能有用的障碍。

障碍 1:ARM Thumb2

总结:尽管宣传为完全支持thumb,但苹果提供的clang 以及LLVM 3.2 的一个未能翻译出现的一些有效的thumb 指令在libav 的 ARM 汇编代码中。

详细信息libavffmpeg 的一个分支)在汇编程序中实现了一些功能。在为 iOS 构建时,使用来自 MobileVLC/ImportedSources/vlc/contrib/iPhoneOS/ffmpeg/libavcodec/arm 的文件。可能遇到的第一个编译错误类似于

libavcodec/arm/aacpsdsp_neon.S:132:21: error: invalid operand for instruction
        add r4, r0, #38*64*4

根据ARM Thumb2's reference,上述指令是一个有效的ADD{S} Rd, Rn, <Operand2>指令,其中<Operand2>thumb模式下是“一个32位常数,由一个8位值左移任意数形成位”。由于#38*64*4 等于 38 左移 8 次,clang 应该接受它。 clang 似乎无法识别它是可能的,因此试图将指令解释为 ADD Rd, Rn, #<imm12> 指令,其直接参数必须小于 4096。

如果对这个主题更有信心的人可以联系 - 这是clang 中的错误吗?

解决方法:如http://forum.videolan.org/viewtopic.php?f=12&t=103271 中所述,在配置ffmpeg(实际上是libav)时应禁用thumb

障碍 2:libtool 无法推断标签

总结MobileVLClibtool 配置为推断 C++ 编译,这需要调用 clang++。当构建系统改为调用gas-preprocessor.pl xcrun clang 时,libtool 会引发错误。

详细信息MobileVLCMobileVLC/ImportedSources/vlc/build-ios-OS 配置libtool(只是一个bash 脚本)的副本。在第 1681 行,函数func_infer_tag 负责推断标签。对于出现在第 38 行定义的变量 $available_tags 中的每个标签,搜索 libtool 本身以查找标签配置部分。例如,CXX (=C++) 标记配置从第 9258 行开始。从第 9271 行可以看出,C++ 编译所期望的编译器命令是xcrun clang++

构建系统调用类似libtool --mode=compile gas-preprocessor.pl xcrun clang … 的东西,并且由于xcrun clang++ 没有为命令添加前缀,因此无法推断C++ 模式。 (gas-preprocessor.pl 将 GNU Assembler 翻译成 Apple 的汇编器可以使用的东西)

解决方法:如http://forum.videolan.org/viewtopic.php?f=12&t=103331 中所述,可以修改MobileVLC/ImportedSources/vlc/modules/video_filter/Modules.am 以强制libtool 推断C 编译。如果它不适合你,就像它不适合我一样,你可以自己打电话给libtool

cd 变成MobileVLC/ImportedSources/vlc/build-ios-OS/modules/video_filter;键入 make 应该会导致出现错误。键入make V=1 也将显示正在执行的命令。它将以source='deinterlace/merge_arm.S' o… 开头。您现在可以复制它并手动调用它,在../../libtool 之后添加--tag=CC

障碍 3:复制字符串文件

总结:构建MobileVLC 失败并出现错误,

The following build commands failed:
    CopyStringsFile build/Release-iphoneos/VLC.app/pl.lproj/Localizable.strings Resources/pl.lproj/Localizable.strings

详细信息:有问题的文件MobileVLC/Resources/pl.lproj/Localizable.strings 是一个 UTF-16-LE 文件,缺少字节顺序标记 (BOM),由于某种原因这让 Xcode 感到困惑。

解决方法:将cd 转换为MobileVLC/Resources/pl.lproj/ 并执行

mv -n Localizable.strings Localizable.strings.backup && python -c "import sys; sys.stdout.write(chr(0xFF)+chr(0xFE))" > Localizable.strings && cat Localizable.strings.backup >> Localizable.strings

这会将 BOM 添加到文件的开头。

障碍 4:non_lazy_ptr + AmplifyFloat

总结:此错误应为:“链接器ld 的内部数据结构有一个非惰性指针,其中包含符号ld 的地址找不到”。找不到缺少的符号,因为它们没有下划线前缀。

详细信息:很遗憾ld 不会让我们了解它无法找到的什么,但我们不是在这里吐槽。

考虑以下简单的bla.c 文件,

int bla();
int foo() { return bla(); }

编译这个文件 (clang -c bla.c) 然后列出它的符号 (nm bla.o) 表明链接器期望其他编译单元提供符号 _bla(注意下划线)。添加下划线大概是为了表示bla 应该在 C 调用约定中被调用。在汇编文件中定义bla 时会出现问题;汇编器没有加下划线,导致bla符号,导致链接失败。

一个有趣的细节是,这种行为与 Linux 不同,在 Linux 中,符号名称不添加下划线,这可能有助于该问题逃避 VLC 开发人员的注意。尽管如此,据我所知,下划线行为出现在 MinGW 中,因此解决方案可能类似。

解决方法:最简单的解决方案,即使是临时的,也是使用符号别名列表。创建一个文件symbol-alias.txt,内容如下,

merge16_arm_neon _merge16_arm_neon
merge8_arm_neon _merge8_arm_neon
amplify_float_arm_neon _amplify_float_arm_neon

这个文件就足够了,取决于标志和配置;不过,这对我来说已经足够了。在MobileVLC/ 目录中键入open MobileVLC.xcodeproj。这应该会启动 Xcode。在项目设置中,选择MobileVLC 目标,然后选择Build Settings。在Other Linker Flags,添加

-Wl,-alias_list
-Wl,<absoluate-path-to-symbol_aliases.txt>

保存并构建。恭喜。你现在已经达到了我不知道如何克服的障碍:)

障碍 5:地址不在任何部分

总结:链接器因神秘错误而失败

ld: in section __TEXT,__text reloc 13: sectionForAddress(0xE142) address not in any section for architecture armv7

我不太熟悉链接以找出问题所在,但我想这一切都归结为用汇编程序编写的代码。

【讨论】:

  • 这是一个很好的答案。不幸的是,它没有帮助。
【解决方案2】:

看你需要目标依赖 libMobileVLCKit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多