«Символ не найден» Сбой при тестировании кода Mac OS X 10.7 для 10.6 - PullRequest
3 голосов
/ 01 сентября 2011

У меня есть приложение, которое использует несколько классов, найденных только в 10.7 Lion.(Например, NSFileCoordinator.)

Когда мое приложение запускается, оно может использовать NSFileCoordinator для координации доступа для чтения к хранилищу данных.(Я сохраняю в XML.)

Приложение запускается нормально под 10.7 Lion, но при запуске под 10.6 Snow Leopard приложение вылетает с ошибкой, показанной ниже.

Мой базовый SDK установлен на10.7, а цель развертывания - 10.6.Насколько я могу судить, весь мой код правильно упакован, например:

if (NSClassFromString(@"NSFileCoordinator") != nil) {
  // Do something the 10.7 way
} else {
  // Do something the 10.6 way
}

Но по какой-то причине я все еще вижу сбой.Поскольку базовый SDK 10.7, я не могу запустить приложение под Xcode в 10.6, что затрудняет отладку.Дополнительные сообщения регистрируются на консоли:

9/1/11 9:48:03 AM   [0x0-0x18018].com.me.myapp[173] dyld: Symbol not found: _OBJC_CLASS_$_NSFileCoordinator
9/1/11 9:48:03 AM   [0x0-0x18018].com.me.myapp[173]   Referenced from: /Volumes/Macintosh HD/Users/Me/Library/Developer/Xcode/DerivedData/Mac-ebdxgdvcqfnptlftkreamrwdxetd/Build/Products/Debug/myapp.app/Contents/MacOS/myapp
9/1/11 9:48:03 AM   [0x0-0x18018].com.me.myapp[173]   Expected in: /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
9/1/11 9:48:03 AM   [0x0-0x18018].com.me.myapp[173]  in /Volumes/Macintosh HD/Users/Me/Library/Developer/Xcode/DerivedData/Mac-ebdxgdvcqfnptlftkreamrwdxetd/Build/Products/Debug/myapp.app/Contents/MacOS/myapp

И отчет о сбое:

Process:         myapp [137]
Path:            /Volumes/Macintosh HD/Users/Me/Library/Developer/Xcode/DerivedData/Mac-ebdxgdvcqfnptlftkreamrwdxetd/Build/Products/Debug/myapp.app/Contents/MacOS/myapp
Identifier:      com.me.myapp
Version:         1.5.0 (150)
Code Type:       X86-64 (Native)
Parent Process:  launchd [92]

Date/Time:       2011-09-01 09:40:32.591 -0400
OS Version:      Mac OS X 10.6.8 (10K549)
Report Version:  6

Interval Since Last Report:          2009 sec
Crashes Since Last Report:           5
Per-App Crashes Since Last Report:   5
Anonymous UUID:                      32784C79-0821-471E-BCBF-BE5874774075

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000
Crashed Thread:  0

Dyld Error Message:
  Symbol not found: _OBJC_CLASS_$_NSFileCoordinator
  Referenced from: /Volumes/Macintosh HD/Users/Me/Library/Developer/Xcode/DerivedData/Mac-ebdxgdvcqfnptlftkreamrwdxetd/Build/Products/Debug/myapp.app/Contents/MacOS/myapp
  Expected in: /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
 in /Volumes/Macintosh HD/Users/Me/Library/Developer/Xcode/DerivedData/Mac-ebdxgdvcqfnptlftkreamrwdxetd/Build/Products/Debug/myapp.app/Contents/MacOS/myapp

Ответы [ 2 ]

3 голосов
/ 04 сентября 2011

@ У Аноми есть правильный ответ, но позвольте мне подробнее остановиться на нем.Вот код инструмента командной строки, который похож на то, что вы делаете:

int main (int argc, const char * argv[])
{
    @autoreleasepool {
        if (NSClassFromString(@"NSFileCoordinator")) {
            NSLog(@"Version >= 10.7");
        } else {
            NSLog(@"Version <  10.7");
        }
    }

    return 0;
}

Единственный каркас, на который эта программа ссылается - это Foundation.Но для слабой связи с этим фреймворком вы должны сделать следующее:

  1. Нажмите на проект в браузере проекта
  2. Перейдите в «Фазы сборки»
  3. Перейдите к «Связать двоичные файлы с библиотеками» и удалите «Foundation.framework»
  4. Перейдите в «Настройки сборки» и добавьте следующие «Другие флаги компоновщика»:

    -weak_framework Foundation

Перестройте свой проект.Я тестировал на OS X 10.6 и 10.7, и ни один не рухнул, и оба дали ожидаемый результат.Надеюсь, это поможет.

3 голосов
/ 04 сентября 2011

Вам необходимо слабо связать каркас, чтобы эти неразрешенные символы не были ошибкой во время загрузки.

...