10.6ではアプリケーションをビルドしますが、デプロイメントでは10.5をターゲットにしています。私は、プログラムが10.6で動作するときにService Management SMJobBless APIを利用したいと思っていますが、10.5で動作するときには特権付きインストーラツールを使用する必要があります。ランタイムAPIの可用性チェック(弱いリンク) - 10.5での不正な動作
私は実行可能なターゲット内のサービス管理フレームワークに弱くリンクしています。私は、コードのいくつかのバリエーション試してみました:
if (SMJobBless != NULL) ...
if (SMJobBless) ...
bool const /* or non-const */ useBlessAPI = SMJobBless != NULL;
if (useBlessAPI) ...
をそして私もcompiler flags listed in a similar-seeming questionを使用してみました。 10.6オン
、printf("%p %d", SMJobBless, SMJobBless != NULL)
は(正しく)SMJobBlessおよび非ヌル1に対して非ヌルポインタ値を出力します。
アプリケーションバンドルを10.5にコピーすると、printf
はSMJobBlessが0x0であることを通知しますが、(間違って)非ヌルポインタに対して1を出力します。
私が動作させる唯一の方法は、すべての最適化をオフにして、変数に関数ポインタを割り当てることです。これは、です。
Boolean (* const blessAPI) (CFStringRef, CFStringRef, AuthorizationRef, CFErrorRef *) = &SMJobBless;
しかし、プロダクションコードの最適化を無効にすることはできません。
[iPhoneの弱いリンクは動作しません](http://stackoverflow.com/questions/3002833/weak-linking-on-iphone-refuses-to-work) –
@Jonathan Grynspan私は再読しました[その質問へのあなたの答え](http://stackoverflow.com/questions/3002833/weak-linking-on-iphone-refuses-to-work/3002845#3002845)と私が望む機能のアドレスを取って再試行しかし、Qで述べたように、コンパイラの最適化をNoneに設定した場合にのみ動作します。 – Richard
アンパサンドで試しましたか?どのコンパイラを使用していますか、GCCかLLVMですか? –