Принудительное включение объектных файлов статической библиотеки, которые не экспортируют никаких символов (GCC / iPhone)

StackOverflow https://stackoverflow.com/questions/1450748

Вопрос

Я создаю статическую библиотеку для использования в приложениях 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top