3

我在 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;

但我无法关闭生产代码的优化!

4

2 回答 2

2

尝试放入extern Boolean SMJobBless() __attribute__((weak_import));使用该功能的文件。它可能没有被正确标记为弱。

于 2010-12-27T23:36:53.860 回答
1

我还发现,类似于评论中引用的问题/答案,如果我将函数指针分配给一个volatile变量,那么一切评估都可以。

于 2010-12-28T15:38:00.817 回答