3

アプリケーションを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;

しかし、本番コードの最適化をオフにすることはできません。

4

2 に答える 2

2

extern Boolean SMJobBless() __attribute__((weak_import));関数を使用するファイルを入れてみてください。適切に弱いとマークされていない可能性があります。

于 2010-12-27T23:36:53.860 に答える
1

また、コメントで引用されている質問/回答と同様に、関数ポインターをvolatile変数に割り当てた場合、すべてが正常に評価されることもわかりました。

于 2010-12-28T15:38:00.817 に答える