2017-10-05 6 views
0

Ich habe Apples Unified Logging System verwendet, die perfekt auf macOS 10.12 funktionierte. Aber jetzt, wenn ich das 10,13 SDK Ziel (und laufen auf 10,12), os_log_error gibt mir ein SIGABRT und ich bekomme diese Fehler der Ausgabekonsole protokolliert:So rufen Sie os_log_error von High Sierra (10.13)

dyld: Symbol not found: __os_log_error_impl 
    Referenced from: /Users/dfrankel/Library/Developer/Xcode/DerivedData/UnrarKit-dlssapvyjlrhkufjcxzwiiojfals/Build/Products/Debug/UnrarKit.framework/Versions/A/UnrarKit (which was built for Mac OS X 10.13) 
    Expected in: /usr/lib/libSystem.B.dylib 

Ich erhalte diese in meiner Unit-Tests, wenn os_log_error und os_log_fault werden aufgerufen, aber die anderen os_log* Makros laufen alle gut.

Ich habe versucht, libSystem.B.tbd zu dem Framework-Ziel und auch zum Einheitentestziel manuell hinzuzufügen, was keinen Unterschied machte.

Antwort

0

Die Makros os_log_error und os_log_fault wurden beide im 10.13 SDK geändert, um ein komplizierteres Verhalten zu erhalten. Die anderen wurden alleine gelassen. Ich habe das aktualisierte Makro unten als Referenz eingefügt.

#if OS_LOG_TARGET_HAS_10_13_FEATURES 
#define os_log_error(log, format, ...) __extension__({ \ 
    os_log_t _log_tmp = (log); \ 
    os_log_type_t _type_tmp = OS_LOG_TYPE_ERROR; \ 
    if (os_log_type_enabled(_log_tmp, _type_tmp)) { \ 
     OS_LOG_CALL_WITH_FORMAT(_os_log_error_impl, \ 
       (&__dso_handle, _log_tmp, _type_tmp), format, ##__VA_ARGS__); \ 
    } \ 
}) 
#else 
#define os_log_error(log, format, ...) \ 
     os_log_with_type(log, OS_LOG_TYPE_ERROR, format, ##__VA_ARGS__) 
#endif // OS_LOG_TARGET_HAS_10_13_FEATURES 

Da mein Ziel ist ein Rahmen, ist es möglich, Ziele es von älteren Betriebssystemen verwenden können, so dass der einzige Weg, dies um, die ich sehen konnte, ist eine Laufzeitprüfung der OS-Version zu tun, und wählen Sie dann bedingt die Makro zum Anrufen.

BOOL isAtLeast10_13SDK; 

#define MyLogError(format, ...) \ 
    if (isAtLeast10_13SDK) os_log_error(my_log, format, ##__VA_ARGS__); \ 
    else os_log_with_type(my_log, OS_LOG_TYPE_ERROR, format, ##__VA_ARGS__); 
#define MyLogFault(format, ...) \ 
    if (isAtLeast10_13SDK) os_log_fault(my_log, format, ##__VA_ARGS__); \ 
    else os_log_with_type(my_log, OS_LOG_TYPE_FAULT, format, ##__VA_ARGS__); 

+ (void)initialize { 
     NSOperatingSystemVersion minVersion; 
#if TARGET_OS_IPHONE 
     minVersion.majorVersion = 11; 
     minVersion.minorVersion = 0; 
     minVersion.patchVersion = 0; 
#else 
     minVersion.majorVersion = 10; 
     minVersion.minorVersion = 13; 
     minVersion.patchVersion = 0; 
#endif 
     isAtLeast10_13SDK = [[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:minVersion]; 
} 
Verwandte Themen