Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > static library как простой набор объектных файлов


Автор: georain 15.12.2010, 19:08
Имеется набор .cpp файлов с которыми нужно собирать несколько библиотек. Естественное решение сделать из них static library и подключать её. Проблема в том, что никак не могу добиться чтобы было обычное поведение, как у набора .cpp файлов.

Например чтобы работал rtti нужно добавлять __attribute__ ((visibility("default")) к классам, а мне бы не хотелось как либо менять код вообще, то есть чтобы код оставался таким, каким он был бы, если бы я собирал с .cpp напрямую.

Ещё проблема с объектами-регистраторами (выполняют код в конструкторе на этапе инициализации библиотеки). При различных режимах линковки, либо вообще не экспортируются и не выполняются, либо конструктор выполняется больше одного раза, этого я вообще понять не могу почему (это когда с --whole-archive).

(+ не могу понять влияние слова static перед определением объекта-регистратора)

gcc 4.4.4

Автор: MAKCim 16.12.2010, 09:44
по идее проблем быть не должно
архив статический - это просто контейнер

Автор: xvr 16.12.2010, 10:57
Ответ уже прозвучал в вопросе: --whole-archive
По поводу 
Цитата

конструктор выполняется больше одного раза
 - совершенно непонятно, вроде не должно такого быть

Еще есть одно но - вот выдержка из info на ld (на опцию --whole-archive):
Цитата

     Two notes when using this option from gcc: First, gcc doesn't know
     about this option, so you have to use `-Wl,-whole-archive'.
     Second, don't forget to use `-Wl,-no-whole-archive' after your
     list of archives, because gcc will add its own list of archives to
     your link and you may not want this flag to affect those as well.

Цитата(georain @  15.12.2010,  19:08 Найти цитируемый пост)
(+ не могу понять влияние слова static перед определением объекта-регистратора)
Это что бы к этому объекту случайно что нибудь не прилинковалось снаружи  smile 


Автор: georain 16.12.2010, 18:13
Все заработало как надо после добавления ко всем проектам
Код

-fvisibility=hidden
-fvisibility-inlines-hidden

и линковкой статических библиотек с --whole-archive
Код

-Wl,--whole-archive -lLibA -lLibB -Wl,--no-whole-archive


Спасибо! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)