Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > GNU toolchain > Runtime relative link with dll


Автор: alexx83 26.10.2012, 10:28
Имеем windows + mingw. Есть dll, путь к которой не должен добавляться в PATH. Есть программа которую нужно слинковать с этой dll. Библиотека будет находиться относительно программы как показано на диаграмме:
 
ORIGIN
  |- bin
  |   \-program.exe
  |- opt
  |   |-lib
  |   |   \-mylib.dll


Есть ли возможность слинковать программу чтобы она сама искала необходимую dll по относительному пути?
Я пробовал вариант с передачей в LDFLAGS параметров
  Wl,-rpath,'../opt/lib' -L/path/to/lib -lmylib
Но скомпилированная программа не ищет по относительному пути.

Автор: kosmonaFFFt 26.10.2012, 10:36
В голову пришел только вариант с динамической подгрузкой через LoadLibrary в программе, без явной линковки программы с dll...

Автор: boostcoder 26.10.2012, 17:00
похоже, '-Wl,-rpath' в мингв не правильно работает. или же это особенность вендус...
спроси лучше в списке рассылки mingw, к примеру. они-то точно знают.

Автор: bems 3.11.2012, 05:40
а что, в секции импорта РЕ-файла допустимо что-то кроме имени экспортирующего модуля? насколько я понимаю как бы линкер не хотел указать расположение дллки, но если он хочет создать корректный модуль, то ему придется записать туда только имя

Автор: leniviy 8.11.2012, 12:02
Аналог rpath под виндой - манифест.

Например, wget.exe из порта unix utils зависит от libeay32.dll . Но мы не хотим класть libeay32.dll в %Path%, чтобы не было dll hell.
Для этого надо убрать из .exe файла встроенный манифест и написать свой.

расположение файлов:
Код

wget.exe
wget.exe.manifest
SomeDlls/libeay32.dll
SomeDlls/SomeDlls.manifest


wget.exe.manifest:
Код

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='SomeDlls' version='1.0.0.0' processorArchitecture='x86' />
    </dependentAssembly>
  </dependency>
</assembly>


SomeDlls/SomeDlls.manifest:
Код

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <noInheritable/>
    <assemblyIdentity type="win32" name="SomeDlls" version="1.0.0.0" processorArchitecture="x86" />
    <file name="libeay32.dll" /> 
</assembly>


Автор: boostcoder 8.11.2012, 12:03
Цитата(leniviy @  8.11.2012,  12:02 Найти цитируемый пост)
надо убрать из .exe файла встроенный манифест

это как?

Цитата(leniviy @  8.11.2012,  12:02 Найти цитируемый пост)
и написать свой.

и это как?

Автор: leniviy 8.11.2012, 12:05
Цитата(alexx83 @  26.10.2012,  10:28 Найти цитируемый пост)
ORIGIN
  |- bin
  |   \-program.exe
  |- opt
  |   |-lib
  |   |   \-mylib.dll


не труЪ. В cygwin и mingw dll файлы традиционно кладут в bin/

Добавлено через 3 минуты и 21 секунду
Цитата(boostcoder @  8.11.2012,  12:03 Найти цитируемый пост)
Цитата(leniviy @  8.11.2012,  12:02 Найти цитируемый пост)
надо убрать из .exe файла встроенный манифест

это как?

1) Если .exe файл запакован upx - распаковать
2) Открыть в редакторе ресурсов, например, visual studio, и удалить.

Цитата(boostcoder @  8.11.2012,  12:03 Найти цитируемый пост)

Цитата(leniviy @  8.11.2012,  12:02 Найти цитируемый пост)
и написать свой.

и это как?

пример выше

Автор: leniviy 8.11.2012, 12:23
upd: чтобы винда искала манифест не в текущей директории, надо правильно обозвать этот ассембли: 

bin/program.exe.manifest:
<assemblyIdentity type='win32' name='..\opt\lib\lib' ...

opt/lib/lib.manifest:
<assemblyIdentity type="win32" name='..\opt\lib\lib'

обратите внимание, что имена совпадают. Проверил на win7

Добавлено @ 12:24
upd2: при тестировании надо всё время переименовывать папку, так как винда кэширует фейлы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)