(我把这个问题发布到VideoLAN论坛,但还没有接受过。我知道SO社区不会让我失望。)
我正在尝试为iOS构建MobileVLC项目。我已经完成了命令行流程来构建项目,经过http://forum.videolan.org/viewtopic.php?f=12&t=103331和http://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选项卡中的所有内容。
编辑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。
答案 0 :(得分:12)
我无法成功构建它,但我已经克服了一些可能有用的障碍。
摘要:尽管宣传为完全支持thumb
,但似乎Apple提供了clang
,而LLVM 3.2
则无法翻译某些有效内容thumb
出现在libav
的ARM汇编程序代码中的libav
指令。
详细信息:ffmpeg
(MobileVLC/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
。
摘要:libtool
的{{1}}配置为推断C ++编译,期望调用clang++
。当构建系统改为调用gas-preprocessor.pl xcrun clang
时,libtool
会抛出错误。
详细信息:MobileVLC
在libtool
配置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
。
摘要:构建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添加到文件的开头。
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>
保存并构建。恭喜。你现在已经到了障碍我不知道如何克服:)
摘要:链接器因隐藏错误而失败
ld: in section __TEXT,__text reloc 13: sectionForAddress(0xE142) address not in any section for architecture armv7
我不太熟悉链接以找出错误的内容,但我想这一切都归结为用汇编语言编写的代码。
答案 1 :(得分:0)
请参阅您需要目标依赖项libMobileVLCKit