Я использую компилятор 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()
который находится в библиотеке, компоновщик отображает в память только эту функцию или всю библиотеку первым?