Я динамически загружаю (dlopen()
) общий объект (по имени libprofile1.so
) от main
.ограничения при динамической загрузке общего объекта из другого общего объекта?
В libprofile1.so
Я определил заводскую функцию CreateProfile
и класс Profile
. Функция CreateProfile
создает экземпляр класса Profile
и возвращает указатель на него. Класс Profile
имеет способ pMethod
.
В основном, после загрузки libprofile1.so
, я звоню CreateProfile
метод, который возвращает указатель на объект класса Profile
(назовем его p
).
Впоследствии, я звоню 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 ???
Возможно, я не знаю, но существуют ли какие-либо ограничения при динамической загрузке общего объекта из общего объекта, который также был динамически загружен?
Btw, dlopen
Используется с RTLD_NOW|RTLD_GLOBAL
. Я пробовал с RTLD_LAZY
, но все та же проблема.
UPDATE:
библиотеки построены в Eclipse. Параметры для компилятора и компоновщика G ++ одинаковы для обеих библиотек.
Вот G ++ компилятор:
-O0 -g3 -Wall -c -fmessage-length=0
и G ++ линкер:
-shared
варианты, вставленный из Project Properties -> Settings -> Tool Settings
Заранее спасибо.
Можете ли вы обновить свой вопрос о том, как создаются libprofile1.so и libdataresources.so? –