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

Я создаю статическую библиотеку для использования в приложениях iPhone. Он содержит несколько исходных файлов, которые не экспортируют символы, все, что они делают, - это создают статический экземпляр класса, который затем запускает некоторый код в своем конструкторе, который регистрирует различные вещи с помощью класса центрального менеджера в другом месте. Все это прекрасно работает, когда код создается как часть стандартного приложения iPhone, но когда он разделен на статическую библиотеку, эти файлы не превращаются в конечный двоичный файл приложения, поэтому конструкторы для экземпляров закрытого класса, которые они содержат, не не запустить, и это вызывает проблемы. Я отключил все опции сборки, связанные с зачисткой и так далее, как для статической сборки библиотеки, так и для окончательной сборки приложения.

Я столкнулся с этой проблемой на компиляторе Metrowerks некоторое время назад, однако в этом случае это происходило даже тогда, когда код был встроен в одно приложение без каких-либо промежуточных библиотек. Решение было довольно простым: просто используйте __declspec(force_export) на экземплярах частного класса, и все хорошо.

Есть ли эквивалент для GCC / iPhone? Я использую Xcode 3.1.4 с GCC 4.2 и нацеливаюсь на iPhone OS 3.1. В качестве альтернативы, есть ли какой-нибудь способ указать приложению связываться в каждом объектном файле в статической библиотеке независимо от того, есть ли на него явная ссылка? Используя ar, я подтвердил, что полный набор объектных файлов превращается в статическую библиотеку.

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 21 сентября 2009

Я думаю, что вы ищете вариант -all_load:

   -all_load
       Loads all members of static archive libraries.  See man ld(1) for
       more information.
3 голосов
/ 20 февраля 2010

-all_load имеет некоторые проблемы, если вам случается связать много библиотек и / или структур (Mac OS X). В этом случае вы должны форсировать все символы из определенной библиотеки, используя -force_load:

g++ test.cpp -o test -force_load libtoload.a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...