2017-10-05 1 views
0

J'ai utilisé Apple Unified Logging System, qui fonctionnait parfaitement sur macOS 10.12. Mais maintenant, quand je cible le 10.13 SDK (et exécuter sur 10,12), os_log_error me donne un SIGABRT et je reçois cette erreur connecté à la console de sortie:Comment appeler os_log_error de 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 

Je reçois dans mes tests unitaires à chaque fois os_log_error et os_log_fault sont appelés, mais les autres macros os_log* fonctionnent correctement.

J'ai essayé d'ajouter manuellement libSystem.B.tbd à la cible du cadre, ainsi qu'à la cible de test unitaire, qui n'a pas fait de différence.

Répondre

0

Les macros os_log_error et os_log_fault ont toutes deux été modifiées dans le SDK 10.13 pour avoir un comportement plus compliqué. Les autres ont été laissés seuls. J'ai collé la macro mise à jour ci-dessous, pour référence.

#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 

Depuis mon objectif est un cadre, il est des cibles possibles peuvent l'utiliser de systèmes d'exploitation plus anciens, de sorte que la seule façon de contourner ce que je pouvais voir est de faire une vérification d'exécution de la version du système d'exploitation, puis sélectionnez conditionnellement qui macro à appeler.

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]; 
}