Проверка доступности API среды выполнения (слабое связывание) - некорректное поведение на 10.5 - PullRequest
3 голосов
/ 27 декабря 2010

Я строю свое приложение на 10.6, но нацеливаюсь на 10.5 для развертывания.Я хочу воспользоваться API-интерфейсом Service Management SMJobBless, когда программа будет работать на 10.6, но мне, очевидно, все равно нужно будет использовать привилегированный инструмент установщика при работе на 10.5.

Я слабо связан с инфраструктурой Service Managementв моей исполняемой цели.Я пробовал несколько вариантов кода:

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;

Но я не могу отключить оптимизацию для производственного кода!

Ответы [ 2 ]

2 голосов
/ 28 декабря 2010

Попробуйте добавить extern Boolean SMJobBless() __attribute__((weak_import)); в файлы, которые используют функцию.Возможно, он не помечен как слабый должным образом.

1 голос
/ 28 декабря 2010

Я также обнаружил, что похоже на вопрос / ответ, процитированный в комментариях , если я назначил указатель функции для переменной volatile, то все оценивается нормально.

...