运行时API可用性检查(弱链接)— 10.5上的错误行为

我正在构建我的应用程序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) ...
我甚至尝试使用类似看似问题中列出的编译器标志。 在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));
放入使用该功能的文件中。它可能没有被正确地标记为弱。     
我还发现,类似于评论中引用的问题/答案,如果我将函数指针指定给
volatile
变量,那么所有评估都可以。     

要回复问题请先登录注册