2017-01-26 25 views
0

Сценарий cmake FindwxWidgets создает список всех .lib-файлов.Список CMake wxWidgets Dll и скопируйте их при установке

Однако этот скрипт не предоставляет список dll wxWidgets.

Что такое сценарий CMake для хранения в списке всех файлов wxWidgets Dll для отладки и выпуска целей?

ps: Я нашел некоторый проект на основе wxWidgets и CMake, но все они связывают статически с wxWidgets.

Незавершенный:

В настоящее время грязным раствора, чтобы извлечь все библиотеки DLL в каталоге WxWidgets и установить в той же папке, что и ех. Однако нет фильтра для используемых компонентов, поскольку он не связан с командой find_package.

# Copy wxWidgets Dll's # extract folder path
file(GLOB wxwidgets_dlls "${wxWidgets_LIB_DIR}/*.dll") list(APPEND WXWidgets_DLL_Slash "") foreach(WXWidgets_DLL ${wxwidgets_dlls}) # Check if dll does not contain "ud" for debug dll get_filename_component(DLL_FILENAME ${WXWidgets_DLL} NAME_WE) string(FIND ${DLL_FILENAME} "ud" debug_annot) if(${debug_annot} LESS 0) string(REPLACE "\\" "/" WXWidgets_DLL ${WXWidgets_DLL}) MESSAGE(STATUS "Install ${WXWidgets_DLL}") list(APPEND WXWidgets_DLL_Slash ${WXWidgets_DLL}) endif() endforeach(WXWidgets_DLL)
install(FILES ${WXWidgets_DLL_Slash} DESTINATION .)

+0

Не уверен, что ваш проект должен использовать CMake, но если нет, то почему вы не компилируете wxWidgets без CMake? Это довольно легко ... – macroland

+0

@macroland Я не компилирую wxWidgets, я компилирую проект, который ссылается на wxWidgets. Однако при динамической компоновке окончательный исполняемый файл требует dll WxWidgets. Поэтому мне нужно найти способ найти и скопировать тезисы Dll с помощью CMake. –

+0

Я бы проголосовал, чтобы закрыть ваш вопрос, потому что непонятно, чего вы на самом деле хотите. Может дать минимальный пример, который показывает, что у вас есть в настоящее время, и что ему не хватает в отношении того, что вы хотите? – usr1234567

ответ

1

Вот пример what я использую вместе с CPack. Он проанализирует .exe с dumpbin/readelf, чтобы найти библиотеки для копирования.

Мой скрипт также пытается удалить результирующие DLL (вы можете удалить эту часть, если хотите). Вставьте это после вашей команды install(TARGETS ...).

Вещи, которые вы, возможно, необходимо отрегулировать (осторожно, они будут расширены до того времени установки):

  • RUNTIME_DIR - подкаталог как bin, где ваши .exe и .dll файлы устанавливаются
  • EXECUTABLE_NAME - имя вашей цели без .exe
  • Третий параметр: fixup_bundle - его \"\", но вам, возможно, потребуется его изменить на \"${wxWidgets_LIB_DIR}\" (каталог из для копирования библиотеки DLL)
install(CODE " 
    include(BundleUtilities) 
    fixup_bundle(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${RUNTIME_DIR}/${EXECUTABLE_NAME}${CMAKE_EXECUTABLE_SUFFIX}\" \"\" \"\") 
    file(GLOB dynamic_libs \"\${CMAKE_INSTALL_PREFIX}/${RUNTIME_DIR}/*${CMAKE_SHARED_LIBRARY_SUFFIX}*\") 
    message(STATUS \"GLOB: \${dynamic_libs}\") 
    foreach(dll IN LISTS dynamic_libs) 
     if(\"${CMAKE_STRIP}\") 
      execute_process(COMMAND ${CMAKE_STRIP} \"-s\" \${dll}) 
     endif() 
    endforeach(dll) 
") 

Update: install(CODE ...) добавляет команды внутри строки в cmake_install.cmake файла дословно, поэтому выражения генератора не расширены. Число полезных переменных также весьма ограничено, например, ${CMAKE_INSTALL_PREFIX} в моем примере расширилось внутри cmake_install.cmake, но ${CMAKE_SHARED_LIBRARY_SUFFIX} следует развернуть перед тем, как идти туда.

Вы можете использовать ${PROJECT_BINARY_DIR}/\${CMAKE_INSTALL_PREFIX}, чтобы создать полный путь к .exe вручную.

+0

Спасибо. Я попробую это завтра и дам отзыв. –

+0

Я пытаюсь использовать $ , который должен быть оценен для окончательного имени exe, но эта переменная не расширяется. –

+0

@ nicolas-f Извините, выражения генератора в этом случае работать не будут. 'install (CODE ..)' просто добавляет команды в строку в файл 'cmake_install.cmake'. В этом выражении генератора файлов не разворачиваются и не хватает большого количества переменных (у нас есть 'CMAKE_INSTALL_PREFIX', но' CMAKE_SHARED_LIBRARY_SUFFIX' необходимо вручную развернуть) – Nazar554