Принудительное включение объектных файлов статической библиотеки, которые не экспортируют никаких символов (GCC / iPhone)
-
12-09-2019 - |
Вопрос
Я создаю статическую библиотеку для использования в приложениях iPhone.Он содержит несколько исходных файлов, которые не экспортируют символы, все, что они делают, это создают статический экземпляр класса, который затем запускает некоторый код в своем конструкторе, который регистрирует различные вещи в центральном классе менеджера в другом месте.Все это прекрасно работает, когда код создается как часть стандартного приложения для iPhone, но когда он разделяется на статическую библиотеку, эти файлы не попадают в конечный двоичный файл приложения, и поэтому конструкторы для экземпляров частного класса, которые они содержат, не запускаются, и это вызывает проблемы.Я отключил все опции сборки, связанные с мертвым удалением и так далее, как для сборки статической библиотеки, так и для окончательной сборки приложения.
Некоторое время назад я столкнулся с этой проблемой в компиляторе Metrowerks, однако в том случае это происходило даже тогда, когда код был встроен в одно приложение без каких-либо промежуточных библиотек.Решение было довольно простым:просто используй __declspec(force_export)
на экземплярах частного класса, и все хорошо.
Есть ли какой-либо эквивалент для GCC / iPhone?Я использую Xcode 3.1.4 с GCC 4.2 и нацелен на iPhone OS 3.1.В качестве альтернативы, есть ли какой-нибудь способ указать приложению ссылаться на каждый объектный файл в статической библиотеке независимо от того, есть ли на него явная ссылка или нет?Я подтвердил использование ar
что полный набор объектных файлов превращается в статическую библиотеку.
Заранее благодарю.
Решение
Я думаю, что вариант, который вы ищете, это -all_load
:
-all_load
Loads all members of static archive libraries. See man ld(1) for
more information.
Другие советы
-all_load
возникают некоторые проблемы, если вам посчастливилось связать много библиотек и / или фреймворков (Mac OS X).В этом случае вам следует принудительно использовать все символы из определенной библиотеки только с помощью -force_load
:
g++ test.cpp -o test -force_load libtoload.a