我在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));
。可能没有正确标记为弱。