crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> dll на mingw должна импортировать ссылки, в dll есть ссылки в загружающий ее exe
Гурман
  опции профиля:
сообщение 1.6.2010, 13:48
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 14.5.2009
Пользователь №: 749

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

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

если нет, как же быть? есть обходной маневр?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 2.6.2010, 11:29
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1577
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 218 раз(а)




Репутация:   12  


да вроде если они объявлены как внешние, то линкеру на них вообще должно быть пофиг.
он у тебя ругается именно на этапе создания самой библиотеки? как объявлены функции?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гурман
  опции профиля:
сообщение 2.6.2010, 13:27
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 14.5.2009
Пользователь №: 749

Спасибо сказали: 0 раз(а)




Репутация:   0  


да, объявлены, как внешние, ругается на этапе сборки .dll, объектный архив .a перед этим собирается

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

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

или я не прав насчет полного разименования ссылок внутрь загружающего приложения?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 3.6.2010, 20:33
Сообщение #4


Профессионал
*****

Группа: Модератор
Сообщений: 1577
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 218 раз(а)




Репутация:   12  


вот тут (блин, еле нашла такое чудо, но подозревала, что оно есть в природе! :) )

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

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

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

Сообщение отредактировал Iron Bug - 3.6.2010, 21:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гурман
  опции профиля:
сообщение 4.6.2010, 8:31
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 14.5.2009
Пользователь №: 749

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

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

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

на досуге попробую первый вариант, но если в lin не заработает, то увы не подходит
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 4.6.2010, 8:55
Сообщение #6


Профессионал
*****

Группа: Модератор
Сообщений: 1577
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 218 раз(а)




Репутация:   12  


у меня вчера под icc "на скорую руку" этот фокус провернуть не вышло: exe-шник никак не соглашается экспортировать функции. сегодня вечером ещё поковыряю, ибо стало интересно :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гурман
  опции профиля:
сообщение 4.6.2010, 10:17
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 14.5.2009
Пользователь №: 749

Спасибо сказали: 0 раз(а)




Репутация:   0  


на скорую руку наверно получится только в MSVC
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 5.6.2010, 0:16
Сообщение #8


Профессионал
*****

Группа: Модератор
Сообщений: 1577
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 218 раз(а)




Репутация:   12  


вот нарыла вроде решение для gcc:

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

но вот под icc никак не хочет! сообщает, что символ неопределён при попытке вызова функции из основного модуля. хрен поймёшь. но надо ещё опции компилера ковырять.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гурман
  опции профиля:
сообщение 7.6.2010, 8:15
Сообщение #9


Студент
*

Группа: Новичок
Сообщений: 10
Регистрация: 14.5.2009
Пользователь №: 749

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Iron Bug @ 5.6.2010, 1:16) *
вот нарыла вроде решение для gcc:

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

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


это же .exe? символ не определен, поскольку все точки разименованы, в .exe не хранятся имена в том же формате, как в .dll, а отладочный формат для этого непригоден (по идее)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 7.6.2010, 11:24
Сообщение #10


Профессионал
*****

Группа: Модератор
Сообщений: 1577
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 218 раз(а)




Репутация:   12  


ну я так поняла, что опция -rdynamic как раз для разыменования и динамических линков ставится.
ещё там есть опция линкера -soname (-Wl -soname).
надо ковырять, мне пока некогда было углубляться на выходных. может, сегодня поковыряю вечером. линь только дома.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 17.12.2018, 9:59