ограничения при динамической загрузке общего объекта из другого общего объекта?

Я динамически загружаю (с помощью dlopen () ) общий объект (с именем libprofile1.so ) из main .

В libprofile1. поэтому Я определил фабричную функцию CreateProfile и класс Профиль . Функция CreateProfile создает экземпляр класса Profile и возвращает на него указатель. Класс Профиль имеет метод pMethod .

В основном после загрузки libprofile1.so я вызываю метод CreateProfile , который возвращает указатель на объект класса Profile (назовите его р ).
После этого я вызываю метод pMethod для объекта p ( p-> pMethod ). В этом методе я динамически загружаю другой общий объект ( libdatasources.so ).

В этом общем объекте у меня есть фабричная функция CreateDataSource и класс DataSource .
Функция CreateDataSource создает экземпляр класса DataSource и возвращает указатель на него. Класс DataSource имеет метод dsMethod .

Как вы можете заметить, структуры обоих общих объектов похожи.

Из pMethod после загрузки libdatasources.so Я вызываю метод CreateDataSource , который возвращает мне указатель на экземпляр класса DataSource , Затем я звоню dsMethod из ds объекта
( ds-> dsMethod ).


Теперь проблема в следующем.

Когда я пытаюсь вызвать объект dsMethod из ds , разделяемый объект, который я загружаю в первый раз ( libprofile1.so ), не загружается. На самом деле dlopen () возвращает NULL . Когда я читаю dlerror после dlopen , я получаю:

./ libprofile1.so: неопределенный символ: _ZN18DataSource13dsMethod

Так что если у меня есть вызов ds-> Method , чем первый общий объект не загружается!
Если я закомментирую вызов ds-> dsMethod из источника, то мои libprofile1.so и libdatasources.so загружаются без каких-либо проблем.
Я не вижу связи между вызовом метода из второго SO и загрузкой первого SO ???

Может быть, я не знаю, но есть ли ограничения при динамической загрузке общего объекта из общего объект, который также был динамически загружен?

Кстати, dlopen используется с RTLD_NOW | RTLD_GLOBAL . Я попытался с RTLD_LAZY , но все еще та же проблема.

ОБНОВЛЕНИЕ:

Библиотеки построены в Eclipse. Параметры компилятора и компоновщика G ++ одинаковы для обеих библиотек.
Вот компилятор G ++:

-O0 -g3 -Wall -c -fmessage-length=0

и компоновщик G ++:

-shared

опции, вставленные из Свойства проекта -> Настройки -> Настройки инструмента

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

6
задан dragan.stepanovic 2 September 2010 в 13:48
поделиться