我在 10.6 上构建我的应用程序,但针对 10.5 进行部署。当程序将在 10.6 上运行时,我想利用服务管理 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 打印一个非空指针值,为非空打印 1。
当我将应用程序包复制到 10.5 时,它printf
告诉我 SMJobBless 为 0x0,但(错误地)为非空指针打印 1。
我让它工作的唯一方法是关闭所有优化并将函数指针分配给一个变量。
Boolean (* const blessAPI) (CFStringRef, CFStringRef, AuthorizationRef, CFErrorRef *) = &SMJobBless;
但我无法关闭生产代码的优化!