繁体   English   中英

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

[英]iOS SDK 5.1 linker error for non_lazy_ptr in Xcode 4.4.1

(我把这个问题发布到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构建阶段

编辑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上运行,这也是一个死胡同,因为构建设置已经设置为No。

以下是该问题和答案的链接: (null):在__TEXT部分,__ text reloc 3:部分地址(0x7C6C)地址不在任何部分中,用于体系结构armv7

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

障碍1:ARM Thumb2

简介 :尽管广告宣传为完全支持thumb ,但它似乎是Apple提供的clang ,而LLVM 3.2无法翻译出现在libav的ARM汇编代码中的一些有效的thumb指令。

详细信息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的参考 ,上面的指令是有效的ADD{S} Rd, Rn, <Operand2>指令,其中thumb模式下的<Operand2>是“32位常数,通过左移8位值形成任意数量的比特“。 由于#38*64*4等于38左移8次,所以clang应该接受它。 似乎clang不会认识到它是可能的,因此试图将指令解释为ADD Rd, Rn, #<imm12> one,其立即参数必须小于4096。

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

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

障碍2:libtool无法推断标签

简介MobileVLClibtool被配置为推断C ++编译,它需要调用clang++ 当构建系统调用gas-preprocessor.pl xcrun clanglibtool会抛出错误。

详细信息MobileVLCMobileVLC/ImportedSources/vlc/build-ios-OS配置libtool (这只是一个bash脚本)的MobileVLC/ImportedSources/vlc/build-ios-OS 在第1681行,函数func_infer_tag负责推断标签。 对于出现在第38行定义的变量$available_tags中的每个标记,将搜索libtool本身的标记配置部分。 例如,CXX(= C ++)标签配置从第9258行开始。从第9271行可以看出,C ++编译xcrun clang++的编译器命令是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… 您现在可以复制并手动调用它,在../../libtool之后添加--tag=CC

障碍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不同,其中下划线没有添加到符号名称,这可能有助于问题摆脱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 这应该是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

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

看你需要目标依赖项libMobileVLCKit

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM