Предотвращение удаления 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)) декоратор.

Другие вопросы по тегам