アプリケーションを10.6でビルドしていますが、デプロイの対象は10.5です。プログラムが10.6で実行されるときに、Service Management SMJobBless APIを利用したいのですが、10.5で実行する場合は、特権インストーラーツールを使用する必要があります。
実行可能ターゲットのサービス管理フレームワークに弱くリンクしています。私はコードのいくつかのバリエーションを試しました:
if (SMJobBless != NULL) ...
if (SMJobBless) ...
bool const /* or non-const */ useBlessAPI = SMJobBless != NULL;
if (useBlessAPI) ...
また、似たような質問にリストされているコンパイラフラグを使用してみました。
10.6では、printf("%p %d", SMJobBless, SMJobBless != NULL)
(正しく)SMJobBlessの場合はnull以外のポインター値を出力し、null以外の場合は1を出力します。
アプリバンドルを10.5にコピーするとprintf
、SMJobBlessは0x0であると表示されますが、(誤って)null以外のポインターに対して1が出力されます。
私がそれを機能させる唯一の方法は、すべての最適化をオフにして、関数ポインターを変数に割り当てることです。
Boolean (* const blessAPI) (CFStringRef, CFStringRef, AuthorizationRef, CFErrorRef *) = &SMJobBless;
しかし、本番コードの最適化をオフにすることはできません。