Предотвращение удаления Xcode неиспользуемых символов из статической библиотеки
Я создал статическую библиотеку, в которую входит мой бинарный файл iOS. Для статической библиотеки отключено удаление кода и т. Д., И я могу видеть символы в архиве (через nm).
Итак, я связываю эту библиотеку с моим приложением в качестве основы. Но я не вызываю эту функцию напрямую. В результате я вижу символы, которые я вызываю, непосредственно в моем двоичном файле, но не те, которые не вызваны. Но, поскольку я действительно хочу, чтобы эти символы присутствовали во время выполнения, я компилирую с -all_load.
Но это, кажется, создает ненужное бремя для пользователей библиотеки. Есть ли что-то, что я могу добавить в статическую библиотеку, которая обеспечивает это, вместо того, чтобы полагаться на пользователя библиотеки?
1 ответ
В зависимости от того, что вы пытаетесь выполнить, вы можете точно контролировать, какие символы полностью удалены, а какие загружены всегда, даже если пользователь библиотеки на самом деле их не использует.
Самый простой способ - создать функцию инициализации библиотеки, которая ссылается на точные символы, которые вы не хотите убирать. Это точно и избавляет вас от необходимости бороться с опциями командной строки компоновщика, которые могут оградить вас от (маловероятных) изменений поведения инструмента в будущем.
Фреймворки имеют автоматические инициализаторы (что очень удобно), которые могут вызываться автоматически при загрузке фреймворка во время выполнения, сразу после инициализации любых статических переменных.
__attribute__((constructor))
static void MyModuleInitializer()
{
static BOOL initialized = NO;
if (!initialized) {
// References to symbols that should be kept around.
initialized = YES;
}
}
Только для улыбок, автоматические финализаторы также поддерживаются с помощью __attribute__((destructor))
декоратор.