Связывание с ключами -R и -rpath в Windows - PullRequest
3 голосов
/ 17 июля 2010

Я использую компилятор gcc (MinGW) в Windows XP. Я создал библиотеку .dll libdir.dll, чем пытался создать программу, использующую эту библиотеку.
Я не хочу ее помещать.DLL-файл в папку System или System32, чтобы не указывать путь к нему в переменной PATH, я хочу передать эту информацию самой программе.
Я знаю, что доступны переключатели -R и -rpath, поэтому я былсобираюсь связать его с одним из них.

Первый -rpath:
gcc -L / path / to / lib -Wl, -rpath, / path / to / lib main.o -ldir -o prog

Than -R:
gcc -L / path / to / lib -Wl, -R, / path / to / lib main.o -ldir -o prog

Это успешно связывается с prog, но когда язапустите программу Windows выводит сообщение, что не может найти libdir.dll.
Поэтому мой вопрос: что пошло не так, почему путь к libdir.dll не известен во время выполнения, даже когда я использую соответствующие ключи?

Допустим, у меня есть prog1 и prog2, каждый из которых содержит свою собственную копию libdir.dll, и оба они начинают работать одновременно, загружая код в библиотеку. Что происходит в памяти, если загружены две копии иликомпоновщик выясняет, что есть копия, и использует ее для обеих программ?
Второй вопрос - о том, как загружаются библиотеки (любая ОС). Линкеры всегда загружают всю библиотеку или только необходимые части? Например, если функция ссылки на программу foo() который находится в библиотеке, компоновщик отображает в память только эту функцию или всю библиотеку первым?

Ответы [ 2 ]

2 голосов
/ 17 июля 2010

Есть только две реальные альтернативы: поместите DLL в ту же папку, что и EXE, или поместите ее в рабочий каталог для EXE.Последний вариант не слишком удобен, так как вам нужно создать ярлык, чтобы рабочий каталог по умолчанию отличался от каталога, содержащего EXE.

Не помещайте DLL в тот же каталог, что и EXE.имеет смысл, если вы хотите поделиться DLL с другими приложениями.Чтобы избежать этого неизбежного адского DLL, вам нужно хранить DLL в параллельном кэше.Инструменты, необходимые для создания манифеста и встраивания его в EXE-файл, и установщик, необходимый для развертывания DLL на целевой машине, вероятно, трудно найти в вашей цепочке инструментов.В любом случае, это делается очень редко.

1 голос
/ 21 августа 2013

Часть этого вопроса является его дубликатом: Существует ли Windows / MSVC, эквивалентный флагу компоновщика -rpath?

Суть ответа в том, что в Windows нет прямого эквивалента RPATH.

Поскольку вы исключили размещение своих DLL в пути поиска библиотек по умолчанию (который в Windows включает системные каталоги, которые вы перечислили, и каталоги в переменной окружения PATH), у вас остаются следующие параметры:

  • с использованием пакетных файлов
  • размещение всех библиотек DLL и исполняемых файлов в одном каталоге
  • выполнение вызовов уровня ОС в вашей программе для добавления в путь поиска DLL
...