Я динамически загружаю (с dlopen()
) общий объект (с именем libprofile1.so
) из main
.
В libprofile1.so
Я определил фабричную функцию CreateProfile
и класс Profile
.Функция CreateProfile
создает экземпляр класса Profile
и возвращает на него указатель.Класс Profile
имеет метод pMethod
.
В основном после загрузки libprofile1.so
я вызываю метод CreateProfile
, который возвращает указатель на объект класса Profile
(назовите его p
).
Впоследствии я 'm вызывает pMethod
метод для объекта p
(p->pMethod
).В этом методе я динамически загружаю другой общий объект (libdatasources.so
).
В этом общем объекте у меня есть фабричная функция CreateDataSource
и функция класса DataSource
.
CreateDataSource
, создающая экземпляр класса DataSource
и возвращающая на него указатель.DataSource
класс имеет метод dsMethod
.
Как вы можете заметить, структуры обоих общих объектов похожи.
С pMethod
после загрузки libdatasources.so
Я вызываю CreateDataSource
метод, который возвращает мне указатель наэкземпляр класса DataSource
, назовите его ds
.Затем я звоню dsMethod
из ds
объекта
(ds->dsMethod
).
Теперь проблема заключается в следующем.
Когда я пытаюсь вызвать dsMethod
объекта ds
, общий объект, который я загружаю в первый раз (libprofile1.so
), не загружается.На самом деле dlopen()
возвращает NULL
.Когда я читаю dlerror
после dlopen
, я получаю:
./libprofile1.so: undefined symbol: _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
опции, вставленные из Project Properties -> Settings -> Tool Settings
Заранее спасибо.