使用 Xcode 4.0.2,我有一个可以在模拟器中正确编译、链接和运行的目标。但是,当我为 iOS 设备编译和链接它时,我收到以下(完整)链接器错误:
Ld /Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Products/Debug-iphoneos/FrameworkHarness.app/FrameworkHarness normal armv7
cd /Users/mike/src/FOO/FOObar
setenv IPHONEOS_DEPLOYMENT_TARGET 4.2
setenv PATH "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc-4.2 -arch armv7 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk -L/Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Products/Debug-iphoneos -F/Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Products/Debug-iphoneos -filelist /Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Intermediates/FOObar.build/Debug-iphoneos/FrameworkHarness.build/Objects-normal/armv7/FrameworkHarness.LinkFileList -dead_strip -miphoneos-version-min=4.2 -framework FOObar -framework UIKit -framework Foundation -framework CoreGraphics -o /Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Products/Debug-iphoneos/FrameworkHarness.app/FrameworkHarness
Assertion failed: (atom->fixupCount() == 1), function targetCString, file /SourceCache/ld64/ld64-123.3/src/ld/parsers/macho_relocatable_file.cpp, line 4831.
0 0x13886 __assert_rtn + 86
1 0x2dfd8 mach_o::relocatable::PointerToCStringSection<arm>::targetCString(mach_o::relocatable::Atom<arm> const*, ld::IndirectBindingTable const&) const + 280
2 0x2b27c mach_o::relocatable::PointerToCStringSection<arm>::contentHash(mach_o::relocatable::Atom<arm> const*, ld::IndirectBindingTable const&) const + 76
3 0x2c57f mach_o::relocatable::Atom<arm>::contentHash(ld::IndirectBindingTable const&) const + 47
4 0xae870 ld::tool::SymbolTable::findSlotForReferences(ld::Atom const*, ld::Atom const**) + 704
5 0xb21dc ld::tool::Resolver::convertReferencesToIndirect(ld::Atom const&) + 268
6 0xb33f2 ld::tool::Resolver::doAtom(ld::Atom const&) + 642
7 0x21f7c mach_o::relocatable::File<arm>::forEachAtom(ld::File::AtomHandler&) const + 60
8 0xaa29e ld::tool::InputFiles::forEachInitialAtom(ld::File::AtomHandler&) const + 46
9 0xb5924 ld::tool::Resolver::resolve() + 84
10 0x14ff7 main + 871
collect2: ld returned 1 exit status
有人可以对此有所了解吗?
谢谢迈克
使用 -v 调用
/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc-4.2 -v -arch armv7 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk -L/Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Products/Debug-iphoneos -F/Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Products/Debug-iphoneos -filelist /Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Intermediates/FOObar.build/Debug-iphoneos/FrameworkHarness.build/Objects-normal/armv7/FrameworkHarness.LinkFileList -dead_strip -miphoneos-version-min=4.2 -framework FOObar -framework UIKit -framework Foundation -framework CoreGraphics -o /Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Products/Debug-iphoneos/FrameworkHarness.app/FrameworkHarness
Using built-in specs.
Target: arm-apple-darwin10
Configured with: /var/tmp/llvmgcc42_Embedded/llvmgcc42_Embedded-2373.6~5/src/configure --enable-checking --enable-werror --prefix=/Developer/usr/llvm-gcc-4.2 --mandir=/Developer/usr/llvm-gcc-4.2/share/man --enable-languages=c,objc,c++,obj-c++ --program-prefix=llvm- --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --enable-llvm=/var/tmp/llvmgcc42_Embedded/llvmgcc42_Embedded-2373.6~5/dst-llvmCore/Developer/usr/local --enable-werror-always --program-prefix=arm-apple-darwin10- --host=i686-apple-darwin10 --target=arm-apple-darwin10 --with-gxx-include-dir=/usr/include/c++/4.2.1 --with-build-sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.Internal.sdk
Thread model: posix
gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2373.6)
/Developer/Platforms/iPhoneOS.platform/Developer/usr/llvm-gcc-4.2/bin/../libexec/gcc/arm-apple-darwin10/4.2.1/collect2 -dynamic -arch armv7 -dead_strip -iphoneos_version_min 4.2 -syslibroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk -weak_reference_mismatches non-weak -o /Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Products/Debug-iphoneos/FrameworkHarness.app/FrameworkHarness -lcrt1.3.1.o -L/Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Products/Debug-iphoneos -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/llvm-gcc-4.2/bin/../lib/gcc/arm-apple-darwin10/4.2.1/v7 -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/llvm-gcc-4.2/bin/../lib/gcc/arm-apple-darwin10/4.2.1 -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/llvm-gcc-4.2/bin/../lib/gcc -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/llvm-gcc-4.2/bin/../lib/gcc/arm-apple-darwin10/4.2.1/../../.. -filelist /Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Intermediates/FOObar.build/Debug-iphoneos/FrameworkHarness.build/Objects-normal/armv7/FrameworkHarness.LinkFileList -framework FOObar -framework UIKit -framework Foundation -framework CoreGraphics -lgcc_s.1 -lgcc -lSystem -F/Users/mike/Library/Developer/Xcode/DerivedData/FOObar-ezjrxybxyybadxguvscgaqtaelju/Build/Products/Debug-iphoneos
Assertion failed: (atom->fixupCount() == 1), function targetCString, file /SourceCache/ld64/ld64-123.3/src/ld/parsers/macho_relocatable_file.cpp, line 4831.
0 0x13886 __assert_rtn + 86
1 0x2dfd8 mach_o::relocatable::PointerToCStringSection<arm>::targetCString(mach_o::relocatable::Atom<arm> const*, ld::IndirectBindingTable const&) const + 280
2 0x2b27c mach_o::relocatable::PointerToCStringSection<arm>::contentHash(mach_o::relocatable::Atom<arm> const*, ld::IndirectBindingTable const&) const + 76
3 0x2c57f mach_o::relocatable::Atom<arm>::contentHash(ld::IndirectBindingTable const&) const + 47
4 0xae870 ld::tool::SymbolTable::findSlotForReferences(ld::Atom const*, ld::Atom const**) + 704
5 0xb21dc ld::tool::Resolver::convertReferencesToIndirect(ld::Atom const&) + 268
6 0xb33f2 ld::tool::Resolver::doAtom(ld::Atom const&) + 642
7 0x21f7c mach_o::relocatable::File<arm>::forEachAtom(ld::File::AtomHandler&) const + 60
8 0xaa29e ld::tool::InputFiles::forEachInitialAtom(ld::File::AtomHandler&) const + 46
9 0xb5924 ld::tool::Resolver::resolve() + 84
10 0x14ff7 main + 871
collect2: ld returned 1 exit status
额外细节
当我将名为 FrameworkHarness 的应用程序的已编译 .m 文件与我创建的名为 FOOBar 的框架链接时,就会发生这种情况。框架配方来自:http ://db-in.com/blog/2011/07/universal-framework-iphone-ios-2-0/
当我:
- 直接使用 FrameworkHarness 的模拟器 .m 文件从 FOObar 框架编译 .m 文件。
- 使用 FrameworkHarness 的 iOS 设备 .m 文件直接从 FOObar 框架编译 .m 文件。
- 将 FOObar 框架与为模拟器编译的 FrameworkHarness 的 .m 文件链接。
当我:
- 将 FOObar 框架与 iOS 设备的已编译 FrameworkHarness 的 .m 文件链接。
我厌倦了通过从框架中删除 5 个区域之一来隔离框架的问题。每次我将修改后的框架与为 iOS 设备编译的 FrameworkHarness 的 .m 文件链接时,都没有链接错误。
接下来,我将框架保持不变,但从应用程序中删除了对框架中 5 个区域之一的调用。我能够隔离会导致 iOS 设备链接器问题的框架区域。我做了同样的过程来删除框架中的代码,并且能够识别链接时导致错误的特定代码。我在框架的那个区域移动了代码,链接错误消失了。然而,我移动的代码是肤浅的,我所做的只是将代码从一个函数移动到一个新函数,然后从原始函数调用该函数。被移动的代码是:
// Prompt are you sure?
NSString *message = [[NSString alloc] initWithFormat:@"Are you sure you want to remove the vlaue \"%@\" from the list?", [array objectAtIndex:[pickerView selectedRowInComponent:0]]];
UIAlertView *alertView =
[[UIAlertView alloc] initWithTitle:@"Confirmation needed"
message:message
delegate:self
cancelButtonTitle:@"Keep"
otherButtonTitles:@"Remove", nil];
[message release];
[alertView show];
[alertView release];
使用 nm 比较框架符号
我在 iOS 设备上运行 nm 并模拟了框架。版本之间存在一些差异,但没有什么令人尖叫的
纳米 -j -a
-j 只显示符号名称(无值或类型)。-a 显示所有符号表条目,包括那些插入以供调试器使用的条目。
diff nm.ios nm.sim
125a126,134
> EH_Frame1
> EH_Frame1
> EH_Frame1
> EH_Frame1
> EH_Frame1
> EH_Frame1
> EH_Frame1
> EH_Frame1
> EH_Frame1
313d321
< ___divsi3
324a333
> _objc_msgSend_fpret
327a337,431
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
> func.eh
- EH_Frame1 和 func.eh 是“S”(除上述以外的部分中的符号)
- ___divsi3 和 _objc_msgSend_fpret 是“U”(未定义)
纳米-j-g
-j 只显示符号名称(无值或类型)。-g 仅显示全局(外部)符号。
diff nm.ios nm.sim
83d82
< ___divsi3
89a89
> _objc_msgSend_fpret
纳米 -j -u
-j 只显示符号名称(无值或类型)。-u 只显示未定义的符号。
diff nm.ios nm.sim
37d36
< ___divsi3
43a43
> _objc_msgSend_fpret
可能的后续步骤
是否有一个链接器标志来告诉它吐出它正在做什么,这样我就可以在断言之前看到它在做什么?