Используя 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
Дополнительные детали
Это произошло, когда я связывал скомпилированные файлы .m для приложения с именем FrameworkHarness с созданной мной платформой FOOBar. Рецепт фреймворка взят из: http://db -in.com / blog / 2011/07 / universal-framework-iphone-ios-2-0 /
Нет ошибки связывания, когда я:
- Компиляция файлов .m из фреймворков FOObar напрямую с файлами .m FrameworkHarness для симулятора.
- Компиляция файлов .m из каркасов FOObar напрямую с файлами FrameworkHarness .m для устройства iOS.
- Свяжите фреймворк FOObar с скомпилированными .m-файлами FrameworkHarness для симулятора.
Ошибка связывания при I:
- Свяжите фреймворк FOObar с скомпилированными файлами .m FrameworkHarness для устройства iOS.
Мне надоело изолировать проблему с фреймворком, удалив одну из 5 областей, которые делают из фреймворка. Каждый раз, когда я связывал измененный фреймворк с скомпилированными файлами .m FrameworkHarness для устройства iOS, не было ошибок при ссылке.
Затем я оставил фреймворк без изменений, но удалил из приложения вызовы в одну из 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 для сравнения символов framworks
Я запускал nm на устройстве iOS и моделировал фреймворки. Были различия между версиями, но ничего, что кричало
нм -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
Возможные следующие шаги
Есть ли флаг компоновщика, чтобы сообщить ему, над чем он работает, чтобы я мог видеть, что он делал перед утверждением?