2017-10-05 17 views
0

MacOS 10.12で完全に動作していたAppleのUnified Logging Systemを使用しています。私は10.13 SDKをターゲット(および10.12上で実行)するときしかし、今、os_log_errorは私にSIGABRTを与え、私はこのエラーが出力コンソールにログインし得る:High Sierra(10.13)からos_log_errorを呼び出す方法

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 

私はユニットテストでこれを取得していたときにos_log_erroros_log_faultが呼び出されますが、その他のos_log*マクロはすべて正常に動作します。

libSystem.B.tbdを手動でフレームワークターゲットに加えて、違いをもたらさなかったユニットテストターゲットに手動で追加しようとしました。

答えて

0

os_log_erroros_log_faultのマクロは、いずれも10.13 SDKで変更され、より複雑な動作をします。他は残された。参考のため、以下の更新されたマクロを貼り付けました。

#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 

私の目標は、フレームワークであるので、それはどの選択条件付きで、その後ターゲットが古いのOSからそれを使用することができますので、私は見ることができました。この周りの唯一の方法は、OSのバージョンのランタイムチェックを行うことです、そして可能ですマクロを呼び出します。

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]; 
} 
関連する問題