Я динамически загружаю (с помощью 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
опции, вставленные из Свойства проекта -> Настройки -> Настройки инструмента
Заранее спасибо.