вовсе не в нём, а в отсутствии RPATH под windows. Как заставить install(TARGETS mytarget RUNTIME_DEPENDENCIES) резолвить dll, которые найдены с помощью pkg-config?
А как у вас вообще работает pkg_check под виндой? Mingw+msys? Чтоб оно работало надо либо как-то указать dll директорию при вызове функции, либо манипулировать path
Установлен из chocolatey. Сам pkg-config находит нужные библиотеки и правильно устанавливает -L и -l флаги, приложение даже запускается из IDE. Но что я должен дальше сделать со своей стороны, чтобы эти dll зарезолвились, я не знаю. Потому что под linux so резолвятся без дополнительных манипуляций.
Могу предложить только руками звать get runtime dependencies и потом install files https://github.com/avm-energo/coma/blob/master/cmake/WinDeployDebug.cmake#L27-L56 например вот что-то такое
Спасибо! Похоже, чего-то вроде DIRECTORIES "$<TARGET_PROPERTY:AVM-Debug,LINK_DIRECTORIES>" у меня и не хватало. Если не найду какого-то идеального решения, то возьму это. Сейчас зацепился глазом за обсуждение RUNTIME_DEPENDENCY_SET. Выглядит, словно оно создано именно для решения этой задачи, но как этим пользоваться решительно невозможно понять)
Да, RUNTIME_DEPENDENCY_SET это именно оно, но работает вот поверх get runtime dependencies. Оно к сожалению не умеет деплоить dll, если dll является другим собираемым таргетом (и это не настраивается). То есть в целом всё делает правильно, но неудобно в некоторых случаях
Но у меня интересующий таргет — это IMPORTED, если я правильно понимаю. В таком случае, мне он должен подойти?
Да, будет работать
Всё оказалось даже интереснее. Он сам по себе зарезолвить dll не может. Ему нужна подсказка в виде DIRECTORIES. Вот только я не знаю, где взять её. Среди всех свойств таргетов, которые достаются через TARGET_PROPERTY, единственный, который имеет осмысленное значение, это следующий: INTERFACE_LINK_LIBRARIES = C:/3rd/mylib/lib/libmylib.dll.a;z;m;stdc++ Как его с использовать с умом пока не знаю. Думаю, буду уже завтра копаться в этом дальше
Всё же, решил сегодня: install(TARGETS mytarget RUNTIME_DEPENDENCIES PRE_INCLUDE_REGEXES "libmylib.dll|libmyotherlib.dll|..." PRE_EXCLUDE_REGEXES ".*" DIRECTORIES "${mylib_LIBRARY_DIRS}" ) Выглядит некрасиво, но похоже, что это лучшее решение, которое у меня получилось.
Плохое решение всё-таки
Имеется ввиду хардкод имён библиотек? Или подход в целом?
Хардкод имён библиотек конечно, не универсальное решение совсем
Это понимаю. В идеале, я хотел правильные имена достать из импортированного таргета. Но в свойствах таргета есть информация лишь об одной dll из двух в пакете. Вторая линкуется транзитивно. Так что единственное, что можно сделать — пойти от обратного и исключить все нежелательные библиотеки. На свежую голову так и сделаю завтра. Большое спасибо за помощь!
+, пока в смаке не допилено это (ещё) до конца
С 3.14 пилят... Сейчас конечно уже лучше, да и другие такого не умеют
Ну, я там делал ещё одно улучшение в эту тему, но не доделал, там часть идей они чуть получше где-то в 3.23 , что ли, втащили
Обсуждают сегодня