Совместно используемые библиотеки Solaris и глобальные переменные

У меня проблема с глобальными переменными в общей библиотеке на Solaris. Рассмотрим следующий образец:

class Foo
{
public:
 Foo() { Init(); }

private:
  void Init() { // do something }
};

У меня есть код в общей библиотеке:

Foo g_Foo;

Я заметил, что конструктор Foo никогда не вызывается в Solaris, тогда как тот же код работает в Linux.

Я использую gcc 3.4.3 и компоновщик Sun.


person Valery    schedule 28.03.2011    source источник
comment
Не могли бы вы опубликовать весь код того, что на самом деле вы делаете? Не думаю, что проблема в ОС.   -  person Mahesh    schedule 28.03.2011
comment
Я поддержу это. Я часто использовал эту идиому в Solaris в прошлом, и она всегда работала. (Правда, я обычно компилировал с помощью Sun CC, но я действительно не думаю, что проблема в g++.)   -  person James Kanze    schedule 28.03.2011
comment
Вы уверены, что это сценарий? Код, который вы разместили, выглядит нормально. Но поведение, о котором вы упомянули, заставляет меня предположить фиаско статической инициализации, хотя код, который вы опубликовали, об этом не говорит.   -  person Alok Save    schedule 28.03.2011
comment
Я работаю над переносом кода на Solaris. Я могу воспроизвести проблему с образцом выше. Еще одно замечание - тот же код, скомпилированный как статическая библиотека, не имеет этой проблемы. Это можно решить, изменив Init на общедоступный и вызвав его из функции инициализации библиотеки (-z initarray=init_lib), но это применимо не во всех случаях.   -  person Valery    schedule 28.03.2011
comment
Вы уверены, что ваша библиотека загружается? Я видел проблемы, когда env ошибался и загружал более старую версию разработки .so, или когда существовали статическая и динамическая версии библиотеки, и она компилировалась с неправильной. Я был вдали от соляриса достаточно долго, поэтому забыл некоторые команды, но вы можете запустить команду для исполняемого файла, чтобы увидеть, какие библиотеки будут использоваться при его запуске (он печатает полную информацию о пути для каждого .so)   -  person Tim    schedule 28.03.2011


Ответы (1)


Вы создаете общий объект с флагом -G? например CC -G -o mylib.so myfile.cpp

Если вы не укажете -G, компилятор может неправильно инициализировать глобальные переменные. См. документацию по компилятору здесь.

Обратите внимание, в документах также говорится, что вы не можете использовать ld, но для связывания вам нужно использовать CC.

person Imron    schedule 03.05.2011