Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: dll на mingw должна импортировать ссылки
Форум на CrossPlatform.RU > Разработка > Инструменты разработчика
Гурман
dll на mingw экспортирует несколько ссылок и функций, но должна импортировать тоже, чтобы при ее загрузке приложением они были связаны, данные и функции находятся в приложении, код в dll должен получить доступ к статическим данным приложения и к функциям

по умолчанию не получается, компоновщик при создании dll ругается на отсутствующие ссылки, вроде помнится, что есть ключи компоновщика, которые заставляют его делать то, что нужно, установить необходимость динамической связи импортируемых ссылок при загружке, но найти не получается, может их нет у mingw?

если нет, как же быть? есть обходной маневр?
Iron Bug
да вроде если они объявлены как внешние, то линкеру на них вообще должно быть пофиг.
он у тебя ругается именно на этапе создания самой библиотеки? как объявлены функции?
Гурман
да, объявлены, как внешние, ругается на этапе сборки .dll, объектный архив .a перед этим собирается

я довольно быстро понял, что прямого выхода нет - загружающее библиотеку приложение уже размещено в памяти, ссылки внутрь него разименованы (если, конечно, нет отладочной информации, но этот случай не рассматривается), поэтому динамический загрузчик не сможет привязать ссылки из библиотеки к точкам входа в приложении

кривой выход видится только один - все, что должно быть доступно библиотеке, оформлять в виде другой библиотеки, к которой производить привязку, и следить, чтобы она загружалась только 1 раз, сразу даже и не видно, как это лучше всего сделать

или я не прав насчет полного разименования ссылок внутрь загружающего приложения?
Iron Bug
вот тут (блин, еле нашла такое чудо, но подозревала, что оно есть в природе! :) )

http://2lx.ru/2010/02/vyzov-fiuncii-exe-iz-dll/

посмотри, там есть примеры как экспортировать функции в exe-шниках. может, mingw это схавает (только ему надо подсунуть дефайны в отдельном файле, я так понимаю, вместо dllimport/dllexport). по-моему, как раз твой случай. я лично это не пробовала. но занятный вопрос - стало интересно попробовать :)

а можно, наверное, просто передавать библиотеке набор ссылок на нужные процедуры через какую-то служебную функцию. типа, перед началом работы проводить "инициализацию" библиотеки и явно передавать ей все нужные точки входа.
Гурман
я что-то такое где-то встречал, но по-моему на mingw это работает только в win, поскольку форматы бинарников отличаются от lin (например, для использования разделяемых библиотек .so никакие def-файлы совершенно не нужны)

а надо сделать мультпасп... тфу, мультиплатформенно

насчет передать библиотеке точки - с данными я так и сделал, и уже это работает, но данные пришлось собрать в одну кучу, чтобы не передавать слишком много указателей, а вот с функциями хуже, их тьма... пришлось их пока дублировать в dll :( потом надо из них отдельную dll сделать

на досуге попробую первый вариант, но если в lin не заработает, то увы не подходит
Iron Bug
у меня вчера под icc "на скорую руку" этот фокус провернуть не вышло: exe-шник никак не соглашается экспортировать функции. сегодня вечером ещё поковыряю, ибо стало интересно :)
Гурман
на скорую руку наверно получится только в MSVC
Iron Bug
вот нарыла вроде решение для gcc:

http://webcache.googleusercontent.com/sear...=clnk&gl=uk

но вот под icc никак не хочет! сообщает, что символ неопределён при попытке вызова функции из основного модуля. хрен поймёшь. но надо ещё опции компилера ковырять.
Гурман
Цитата(Iron Bug @ 5.6.2010, 1:16) *
вот нарыла вроде решение для gcc:

http://webcache.googleusercontent.com/sear...=clnk&gl=uk

но вот под icc никак не хочет! сообщает, что символ неопределён при попытке вызова функции из основного модуля. хрен поймёшь. но надо ещё опции компилера ковырять.


это же .exe? символ не определен, поскольку все точки разименованы, в .exe не хранятся имена в том же формате, как в .dll, а отладочный формат для этого непригоден (по идее)
Iron Bug
ну я так поняла, что опция -rdynamic как раз для разыменования и динамических линков ставится.
ещё там есть опция линкера -soname (-Wl -soname).
надо ковырять, мне пока некогда было углубляться на выходных. может, сегодня поковыряю вечером. линь только дома.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.