Есть разделяемая библиотека - .so модуль.
Все с ним хорошо - загружается, функции вызываются.
Один прикол - Во время компиляции библиотеки не все необходимы модули прилинкованы - указаны в маке файле. Компиляция происходит успешно, а то, что есть неразрешенные ссылки мы узнаем только тогда, когда делается dlopen.
Что, в Линухе - разделяемая библиотека может пользоваться классами в основном модуле и ругачка происходит - только когда "на лету" этого нельзя сделать ?
Если это не так - то почему компилятор не "ругается" во время линковки so модуля ?
По идее, даже если указана опция -fPIC - линковщик должен был об этом сказать.
А то получается - об неразрешенных связях я не знаю до самого момента згрузки.
компиляция .so модуля
с++ -с main.cpp -o main.o -fPICлинковка .so модуля
с++ main.o -o main.so -fPIC -shared
>Компиляция происходит успешно, а то, что
>есть неразрешенные ссылки мы узнаем только тогда, когда делается dlopen.А как, по вашему, компилятор узнает во время линковки, с какими аргументами будет вызвана функция dlopen? Есть разница: прилинковать библиотеку или открыть её (dlopen) во время выполнения. dlopen нужна в тех случаях, когда на этапе линковки неизвестно, какая библиотека будет использоваться. Наглядный пример - плагины, которых может быть произвольное количество. А может и вовсе не быть.
>>Компиляция происходит успешно, а то, что
>>есть неразрешенные ссылки мы узнаем только тогда, когда делается dlopen.
>
>А как, по вашему, компилятор узнает во время линковки, с какими аргументами
>будет вызвана функция dlopen? Есть разница: прилинковать библиотеку или открыть её
>(dlopen) во время выполнения. dlopen нужна в тех случаях, когда на
>этапе линковки неизвестно, какая библиотека будет использоваться. Наглядный пример - плагины,Вот про них - про плагины - и речь. И dlopen - такой как в мане с именем библиотеки.
Но дело не в dlopen- он то как раз делает свою работу и делает ее хорошо.Напрягает то, что линковщиком библиотеки не контролируется наличие неопределенных ссылок. Былобы конечно "круто" в данном случае, чтобы сам dlopen находил эти ссылки в модуле основной программы - только слабо представляю себе как это будет выглядеть физически
Но можно успокоиться - этого не происходит.
Поэтому и непонятка - почему линковщик вдруг делает за меня предположения - что те функции которые я использую - чудесным образом найдутся в момент dlopen ???.Ведь когда делается ИСПОЛНЯЕМЫЙ модуль - он с этой задачей справлятся замечательно.
Це видно человека с опытом разработки под Win32.
Идеология работы с разделяемыми библиотеками под UNIX другая. Действительно, часть символов может быть недоступна на этапе линковки и предоставляться уже при загрузке библиотеки в основную программу.
>Це видно человека с опытом разработки под Win32.Угу :) Простите пожалуста :)
>Идеология работы с разделяемыми библиотеками под UNIX другая. Действительно, часть символов может
>быть недоступна на этапе линковки и предоставляться уже при загрузке библиотеки
>в основную программу.Во веселуха - узнать что ты чтото не прилинковал в плагин -
на этапе работы приложения. Тут такого можно огрести - мало не покажется.
Поэтому и есть подозрение что данный вопрос должен быть красиво решен
на этапе линковки. Только неизвестно - а как ?.
[...]
>Поэтому и есть подозрение что данный вопрос должен быть красиво решен
>на этапе линковки. Только неизвестно - а как ?.Попробую предположить: ldd --as-needed ?
>Попробую предположить: ldd --as-needed ?Нет такого ключа в опциях. Да и нужно сообщение "при линковке" от gcc .