#linux #ubuntu #shared-libraries #ld
#linux #ubuntu #разделяемые библиотеки #ld
Вопрос:
Компоновщик в Ubuntu 11.10, похоже, игнорирует библиотеки, которые я указал в строке ссылки, если они не содержат никаких символов, используемых связанным приложением:
Linking CXX executable ../../bin/gpu_sd_list
cd /home/eile/Software/gpu-sd/debug/apps/gpu_sd_list amp;amp; /usr/bin/cmake -E cmake_link_script CMakeFiles/gpu_sd_list.dir/link.txt --verbose=1
/usr/bin/c -Wall -Wextra -Winvalid-pch -Wnon-virtual-dtor -Wsign-promo -Wshadow -Winit-self -Wno-unknown-pragmas -Wno-unused-parameter -Wno-write-strings -Werror -g CMakeFiles/gpu_sd_list.dir/gpu_sd_list.cpp.o -o ../../bin/gpu_sd_list -rdynamic ../../lib/libgpusd_remote_dns_sd.so.1.0.0 -ldns_sd ../../lib/libgpusd_remote.so.1.0.0 -Wl,-rpath,/home/eile/Software/gpu-sd/debug/lib:
ldd ./debug/bin/gpu_sd_list
linux-vdso.so.1 => (0x00007fff0a5c6000)
libgpusd_remote.so.1 => /home/eile/Software/gpu-sd/debug/lib/libgpusd_remote.so.1 (0x00007ff9a21fc000)
libstdc .so.6 => /usr/lib/x86_64-linux-gnu/libstdc .so.6 (0x00007ff9a1ece000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff9a1cb7000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff9a1918000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff9a1694000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff9a2406000)
отсутствует libgpusd_remote_dns_sd.so.1.0.0. Это работает в Ubuntu 11.04. Библиотека содержит статический инициализатор, регистрирующий модуль в библиотеке gpusd_remote. Если он не загружен при запуске программы, функциональность отсутствует. Полный исходный код находится по адресуhttps://github.com/Eyescale/gpu-sd
Комментарии:
1. Можете ли вы каким-либо образом явно ссылаться (из своего кода) на этот инициализатор?
2. Идея заключается в том, что пользователи этой библиотеки могут решать, какие модули им нужны, просто связывая их со своим приложением.
3. Конечно, но, похоже, это не работает.
Ответ №1:
Вы могли бы сделать что-то вроде:
.... -Wl,-no-as-needed -lfoo -lbar -Wl,-as-needed
Это будет связано с libfoo
и libbar
независимо от того, действительно ли они нужны или нет.
as-needed
является настройкой по умолчанию в некоторых дистрибутивах, поскольку в большинстве случаев это имеет смысл.
(Хотя я не уверен, что ваш дизайн — хорошая идея.)
Комментарии:
1. Спасибо, добавив ‘set(CMAKE_EXE_LINKER_FLAGS «-Wl,—no-as-needed»)’ в мой CMakeLists.txt решена проблема.
2. Перепроектирование: в библиотеке есть разные модули для запроса, какие графические процессоры доступны, например, AGL и GLX. У каждой есть свои зависимости. Затем приложение может выбрать, какую из них использовать, и какие другие DSO подключены. У вас есть предложения о том, как добиться этого лучше?
3. Обычная библиотека с
initFooBar(params)
методом, который загружает соответствующие «реальные» библиотеки во время выполнения и выполняет любую необходимую инициализацию. Это довольно распространенный подход «плагина».4. Конечно, это требует, чтобы базовая библиотека заранее знала все плагины. Я подумаю об этом — спасибо.
5. Это не так. Базовая библиотека может обрабатывать файлы конфигурации и / или env. vars, например.