2012-04-05 2 views
2

На моем MacOSX я разработал приложение, которое использует библиотеки Qt и VTK. Я создаю make-файл, используя CMake.CMake: построить межплатформенное распределение

Теперь я хочу скомпилировать автономный пакет конечного пользователя в Windows, и он должен работать на компьютере конечного пользователя без предварительной установки библиотек Qt или VTK. Я думаю, это можно сделать, изменив файл CMakeLists.txt, но веб-поиск не указал мне правильное направление.

Как сделать дистрибутивный пакет для Windows с помощью CMake?

+0

Что вы пытались и что не работали? Сначала попробуйте скомпилировать все это в Windows. Если он работает, перейдите в упаковку - посмотрите 'cpack' и' cpack-nsis'. – Anonymous

ответ

1

Что я сделал в одном из своих проектов, напишите небольшой скрипт, который даст мне файлы .so или .dll из переменных cmake-переменных VTK и переменных QT_LIBRARIES.

После этого я добавляю эти файлы .dll или .so к моим объектам установки (пример сценариев ниже), и цель установки скопирует файлы .dll или .so из VTK_DIR или QTDIR в $ {CMAKE_INSTALL_PREFIX} \ bin , Это совместимо с CPack, поэтому вы можете написать небольшой скрипт cpack.

Заметим, однако, что вам нужно немного больше на окнах, чтобы получить конечного пользователя автономный пакет: Вам также потребуется «система-библиотеки» (msvcrt.dll, msvcrp.dll или mingwm10. dll, libstdC++. dll). Например. взгляните на this question.

В окнах следующие скрипты обнаруживают все Vtk dlls от VTK_DIR.

file(GLOB VTK_DLLS ${VTK_RUNTIME_LIBRARY_DIRS}/*.dll) 
if(VTK_DLLS) 
    foreach(Vtk_library ${VTK_DLLS}) 
     # Add it to the list of 'desired' vtk-libraries for later installation 
     list(APPEND Vtk_Install_Libraries ${Vtk_library}) 
    endforeach(Vtk_library ${VTK_DLLS}) 
    list(REMOVE_DUPLICATES Vtk_Install_Libraries) 
    install(FILES ${Vtk_Install_Libraries} DESTINATION bin COMPONENT ThirdParty ) 
endif(VTK_DLLS) 

И для Qt сценарий немного длиннее, потому что мне нужно было найти библиотеки для отладки и выпуска. Верхняя сторона: он ищет только те компоненты, которые я запросил, с find_package(Qt4 ...)

# If Qt-4 was used, add the 'found' Qt-libraries to the Install-target. 
if (USE_QT) 
    foreach(Qt_library ${QT_LIBRARIES}) 
     # With QT_USE_IMPORTED_TARGETS, we should extract the dll info 
     # from the target properties 
     get_target_property(Qt_lib_name ${Qt_library} IMPORTED_LOCATION) 
     get_target_property(Qt_lib_name_debug ${Qt_library} IMPORTED_LOCATION_DEBUG) 
     get_target_property(Qt_lib_name_release ${Qt_library} IMPORTED_LOCATION_RELEASE) 

     # Initially assume the release dlls should be installed, but 
     # fall back to debug if necessary 
     if (Qt_lib_name_release AND EXISTS ${Qt_lib_name_release}) 
      set(Qt_library_location ${Qt_lib_name_release}) 
     elseif (Qt_lib_name_debug AND EXISTS ${Qt_lib_name_debug} AND ENVIRONMENT_DEBUG) 
      set(Qt_library_location ${Qt_lib_name_debug}) 
     elseif (Qt_lib_name AND EXISTS ${Qt_lib_name}) 
      set(Qt_library_location ${Qt_lib_name}) 
     endif (Qt_lib_name_release AND EXISTS ${Qt_lib_name_release}) 

     # Extract the filename part, without the lib-prefix or the .a or ..lib suffix 
     get_filename_component(Qt_library_name ${Qt_library_location} NAME_WE) 
     string(REGEX REPLACE "^lib(.*)" "\\1" Qt_library_name ${Qt_library_name}) 

     set(Qt_shared_library ${QT_BINARY_DIR}/${Qt_library_name}.dll) 
     if (EXISTS ${Qt_shared_library}) 
      # Add it to the list of 'desired' qt-libraries for later installation 
      list(APPEND Qt_Install_Libraries ${Qt_shared_library}) 
     else (EXISTS ${Qt_shared_library}) 
      message(WARNING " could not find ${Qt_shared_library}") 
     endif (EXISTS ${Qt_shared_library}) 
    endforeach(Qt_library ${QT_LIBRARIES}) 
    # When building against a static Qt, the list of Qt_Install_Libraries can be empty 
    if (Qt_Install_Libraries) 
     list(REMOVE_DUPLICATES Qt_Install_Libraries) 
     install(FILES ${Qt_Install_Libraries} DESTINATION bin COMPONENT ThirdParty) 
    endif (Qt_Install_Libraries) 
endif (USE_QT)  
+0

CPack был путем, спасибо! Сценарий для библиотек VTK/Qt также был действительно полезен – CodificandoBits

Смежные вопросы