Shared stub библиотека. Как заставить линковаться с другими
От: den123 Израиль http://den123.smugmug.com
Дата: 01.12.04 05:59
Оценка:
Здравствуйте!
Написал shared stub библиотеку (одни заголовки и возврат). Отдал в другой отдел. Все хорошо. Приложение компилируется и создается без проблем.

Теперь подменяем shared stub библиотеку на настоящую shared библиотеку, которая в свою очередь использует другие shared библиотеки и получаем проблемы с неразрешенными ссылками из вторых библиотек.

Если собрать приложение со всеми реальными shared библиотеками, то все хорошо.

Как указать (и где), что надо искать неразрешенные ссылки динамически, во время выполнения приложения?

Спасибо
WBR — Yuriy
Re: Shared stub библиотека. Как заставить линковаться с друг
От: aka50 Россия  
Дата: 01.12.04 08:32
Оценка:
Здравствуйте, den123, Вы писали:

D>Здравствуйте!

D>Написал shared stub библиотеку (одни заголовки и возврат). Отдал в другой отдел. Все хорошо. Приложение компилируется и создается без проблем.
D>Теперь подменяем shared stub библиотеку на настоящую shared библиотеку, которая в свою очередь использует другие shared библиотеки и получаем проблемы с неразрешенными ссылками из вторых библиотек.
D>Если собрать приложение со всеми реальными shared библиотеками, то все хорошо.
D>Как указать (и где), что надо искать неразрешенные ссылки динамически, во время выполнения приложения?

Вообще довольно странно... скорее всего когда Вы собираете реальную so, не указываете
к от чего она зависит. Проверятеся это легко.

Пусть мы имеем проект с главным модулем и двумя, подгружаемыми по dlopen().
При чем один модуль использует libz.so, чего не использует главный модуль.

$ ldd ./test
./test:
libstdc++.so.3 => /usr/lib/libstdc++.so.3 (0x28067000)
libm.so.2 => /usr/lib/libm.so.2 (0x280ac000)
libc.so.4 => /usr/lib/libc.so.4 (0x280c8000)
$ ldd ./module.so
./module.so:
libz.so.2 => /usr/lib/libz.so.2 (0x28106000)
libstdc++.so.3 => /usr/lib/libstdc++.so.3 (0x28113000)
libm.so.2 => /usr/lib/libm.so.2 (0x28158000)
$ ldd ./module2.so
./module2.so:
libstdc++.so.3 => /usr/lib/libstdc++.so.3 (0x28106000)
libm.so.2 => /usr/lib/libm.so.2 (0x2814b000)


При этому module.so и module2.so имеют одинакувую структуру. Т.е. похожи
на ваши stub. (линее поскипано)

$ nm ./module.so | c++filt
00000618 T TestFunction
U zError
$ nm module2.so| c++filt
000005e0 T TestFunction


Но при запуске все работает нормально:

$ ./test
Module ./module.so opened
Module:./module.so OK
Module ./module.so closed
Module ./module2.so opened
Module:./module2.so OK
Module ./module2.so closed


Если убрать зависимость от libz, то получим

Can't opend shared object:./module.so: Undefined symbol "zError"
Module ./module2.so opened
Module:./module2.so OK
Module ./module2.so closed


Т.е. ошибка скорее всего в том, что при сборке .so не добавляются
зависимости от внешних библиотек.


ЗЫ: Переходите на чтонить нормальное для ведения проекта. Вот пример
для CMake:

SET(CMAKE_CXX_FLAGS
"-Wall -rdynamic -fno-rtti"
CACHE STRING
"Flags used by the compiler during debug builds."
)

SET(CMAKE_EXE_LINKER_FLAGS
"-rdynamic"
CACHE STRING
"Flags used by the compiler during debug builds."
)

PROJECT(TEST)
SET(CMAKE_SHARED_MODULE_PREFIX "" CACHE INTERNAL "No prefix for modules")

ADD_EXECUTABLE(test main.cpp)
ADD_LIBRARY(module MODULE module.cpp)
TARGET_LINK_LIBRARIES(module z)
ADD_LIBRARY(module2 MODULE module2.cpp)

Re: Shared stub библиотека. Как заставить линковаться с друг
От: den123 Израиль http://den123.smugmug.com
Дата: 01.12.04 16:49
Оценка:
Нашел решение.
В параметры создания реальной библиотеки добавил прямое указание на дополнительные библиотеки (опции -L и -l...).
Теперь все нормально.

Для себя я эту проблему объяснил так: когда создается реальное приложение, то все необходимые библиотеки указаваются прямо. При создании пустышки никаких указаний на использование других библиотек не было — они и не подключились поэтому после подмены пустышки на растоящую библиотеку при загрузке реального приложения получились неразрешенные ссылки.
WBR — Yuriy
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.