Xcode 4.4.1中non_lazy_ptr的iOS SDK 5.1链接器错误

时间:2012-08-18 02:38:05

标签: ios xcode linker vlc

(我把这个问题发布到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项目的Build Phases选项卡中的所有内容。

MobileVLC Build Phases

编辑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上发现类似的错误,表明解决方案是检查以确保Generate Position-Dependent Code构建设置中的Apple LLVC compiler 4.0 - Code Generation选项设置为否。但是通常尝试让VLC在iOS上运行,这也是一个死胡同,因为构建设置已经设置为No。

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

2 个答案:

答案 0 :(得分:12)

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

障碍1:ARM Thumb2

摘要:尽管宣传为完全支持thumb,但似乎Apple提供了clang,而LLVM 3.2则无法翻译某些有效内容thumb出现在libav的ARM汇编程序代码中的libav指令。

详细信息ffmpegMobileVLC/ImportedSources/vlc/contrib/iPhoneOS/ffmpeg/libavcodec/arm的一个分支)在汇编程序中实现了一些功能。在为iOS构建时,会使用libavcodec/arm/aacpsdsp_neon.S:132:21: error: invalid operand for instruction add r4, r0, #38*64*4 中的文件。可能遇到的第一个编译错误类似于

ADD{S} Rd, Rn, <Operand2>

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

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

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

跨栏2:libtool无法推断标签

摘要libtool的{​​{1}}配置为推断C ++编译,期望调用clang++。当构建系统改为调用gas-preprocessor.pl xcrun clang时,libtool会抛出错误。

详细信息MobileVLClibtool配置MobileVLC/ImportedSources/vlc/build-ios-OS(只是一个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汇编程序转换为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…开头。您现在可以复制并手动调用它,在--tag=CC之后添加../../libtool

跨栏3:CopyStringsFile

摘要:构建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是缺少字节顺序标记(BOM)的UTF-16-LE文件,由于某种原因会混淆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(注意下划线)。可能会添加下划线以表示应在C调用约定中调用bla。在汇编程序文件中定义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

此文件足够取决于标志和配置;不过,这对我来说已经足够了。在open MobileVLC.xcodeproj目录中键入MobileVLC/。这应该是laungh 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

我不太熟悉链接以找出错误的内容,但我想这一切都归结为用汇编语言编写的代码。

答案 1 :(得分:0)

请参阅您需要目标依赖项libMobileVLCKit