我正在构建我的应用程序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) ...
我甚至尝试过使用compiler flags listed in a similar-seeming question。
在10.6上,printf("%p %d", SMJobBless, SMJobBless != NULL)
(正确)为SMJobBless打印一个非空指针值,为非空打印一个非空指针值。
当我将应用程序包复制到10.5时,printf
告诉我SMJobBless是0x0,但是(错误地)为非空指针打印1。
我让它工作的唯一方法是关闭所有优化并将函数指针指定给变量。
Boolean (* const blessAPI) (CFStringRef, CFStringRef, AuthorizationRef, CFErrorRef *) = &SMJobBless;
但我无法关闭生产代码的优化!
答案 0 :(得分:2)
尝试将extern Boolean SMJobBless() __attribute__((weak_import));
放入使用该功能的文件中。它可能没有被正确地标记为弱。
答案 1 :(得分:1)
我还发现,similar to the question/answer cited in comments,如果我将函数指针分配给volatile
变量,那么所有评估都可以。