Ответ 1
Пожалуйста, посмотрите ld и WIN32 (cygwin/mingw). В частности, прямая ссылка на dll для получения дополнительной информации о поведении флага -l
в портах Windows LD. Выдержка:
Например, когда ld вызывается с аргументом -lxxx, он попытается найти в первом каталоге пути поиска
libxxx.dll.a xxx.dll.a libxxx.a cygxxx.dll (*) libxxx.dll xxx.dll
прежде чем перейти к следующему каталогу в пути поиска.
(*) На самом деле это не
cygxxx.dll
, но на самом деле это<prefix>xxx.dll
, где<prefix>
задается опцией ld-dll-search-prefix=<prefix>
. В случае cygwin стандартный файл спецификации gcc включает-dll-search-prefix=cyg
, поэтому мы фактически ищемcygxxx.dll
.
ПРИМЕЧАНИЕ. Если вы когда-либо создавали Boost с MinGW, вы, вероятно, помните, что имена библиотек Boost точно соответствуют шаблону, описанному в ссылке выше.
В прошлом в MinGW были проблемы с прямой привязкой к *.dll
, поэтому было рекомендовано создать статическую библиотеку lib*.a
с экспортированными символами из *.dll
и вместо нее ссылаться на нее. Ссылка на эту wiki-страницу MinGW теперь мертва, поэтому я предполагаю, что теперь должно быть хорошо, чтобы прямо ссылаться на *.dll
. Кроме того, я делал это сам несколько раз с последним дистрибутивом MinGW-w64 и еще не имел проблем.
Вам нужны флаги ссылок -Wl,-Bstatic
и -Wl,-Bdynamic
, потому что иногда вы хотите принудительно установить статическую привязку, например, когда динамическая библиотека с тем же именем также присутствует в пути поиска:
gcc object1.o object2.o -lMyLib2 -Wl,-Bstatic -lMyLib1 -Wl,-Bdynamic -o output
Приведенный выше фрагмент гарантирует, что приоритет привязки по умолчанию для флага -l
переопределен для MyLib1
, то есть даже если MyLib1.dll
присутствует в пути поиска, LD выберет libMyLib1.a
для ссылки. Обратите внимание, что для MyLib2
LD снова предпочтет динамическую версию.
ПРИМЕЧАНИЕ. Если MyLib2
зависит от MyLib1
, то MyLib1
также динамически связывается независимо от -Wl,-Bstatic
(т.е. в этом случае игнорируется). Чтобы этого не произошло, вам придется привязать MyLib2
статически тоже.