我在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) ...


我什至尝试使用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;


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

最佳答案

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

08-24 13:29