2010-12-27 4 views
3

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; 

しかし、プロダクションコードの最適化を無効にすることはできません。

+0

[iPhoneの弱いリンクは動作しません](http://stackoverflow.com/questions/3002833/weak-linking-on-iphone-refuses-to-work) –

+0

@Jonathan Grynspan私は再読しました[その質問へのあなたの答え](http://stackoverflow.com/questions/3002833/weak-linking-on-iphone-refuses-to-work/3002845#3002845)と私が望む機能のアドレスを取って再試行しかし、Qで述べたように、コンパイラの最適化をNoneに設定した場合にのみ動作します。 – Richard

+0

アンパサンドで試しましたか?どのコンパイラを使用していますか、GCCかLLVMですか? –

答えて

2

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

+0

これは機能しますが、必要ではありません。 – Richard

関連する問題