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

时间:2010-12-27 19:14:52

标签: macos api compatibility weak-linking

我正在构建我的应用程序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) ...

我甚至尝试过使用compiler flags listed in a similar-seeming question

在10.6上,printf("%p %d", SMJobBless, SMJobBless != NULL)(正确)为SMJobBless打印一个非空指针值,为非空打印一个非空指针值。

当我将应用程序包复制到10.5时,printf告诉我SMJobBless是0x0,但是(错误地)为非空指针打印1。

我让它工作的唯一方法是关闭所有优化并将函数指针指定给变量。

Boolean (* const blessAPI) (CFStringRef, CFStringRef, AuthorizationRef, CFErrorRef *) = &SMJobBless;

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我还发现,similar to the question/answer cited in comments,如果我将函数指针分配给volatile变量,那么所有评估都可以。