Хранение символов из разных сборок статических библиотек отдельно - PullRequest
0 голосов
/ 16 июня 2011

У меня есть статическая библиотека Objective-C ++ basic.a , с функцией BasicFunction().Статические библиотеки Objective-C ++ foo.a и bar.a зависят от basic.a и имеют функции Foo() и Bar(), которые вызывают BasicFunction(),

Вот сложная часть: когда я создаю проект, который связывает в foo.a и bar.a , каждый из которых построен в разное время, я хочу Foo() для вызова версии BasicFunction(), которая была там, когда она была построена, и Bar() для вызова версии BasicFunction(), которая была там, когда она была построена.(Это связано с тем, что более новые библиотеки не будут ссылаться на старые BasicFunction(), в которых отсутствуют исправления ошибок.)

В настоящее время происходит то, что Foo() и Bar() обе вызывают одну и ту же версию BasicFunction()тот, который находится в зависимости от двух foo.a и bar.a , которые связаны первыми в проекте.Изменение видимости символа, похоже, не работает, потому что, если BasicFunction() скрыто, оно скрыто в basic.a и не может быть видно с помощью foo.a или bar.a .

Если нет хорошего способа заставить библиотеки вызывать разные версии BasicFunction(), как я могу хотя бы обнаружить проблему?Я пробовал класс стража, который проверяет, чтобы он был инициализирован только один раз, но компоновщик, похоже, оптимизирует двух часовых в разных сборках basic.a в одну, опять же из любой библиотеки, которая являетсясвязаны первыми.

1 Ответ

0 голосов
/ 17 июня 2011

Что ж, вряд ли кто-то еще столкнется с этой конкретной проблемой, но решение состояло в том, чтобы иметь класс стража Objective-C, вызываемый из простой функции C, оба с уникальными именами в каждой сборке, вызываемые каждой библиотекой.Класс sentinel гарантирует, что во время выполнения существует только один экземпляр с его именем.

...