2012-04-05 18 views
2

私のMacOSXでは、QtとVTKライブラリを利用するアプリケーションを開発しました。私はCMakeを使ってmakefileを生成します。CMake:クロスプラットフォーム配布を構築する

ここでは、Windowsでエンドユーザーの自己完結型パッケージをコンパイルしたいと思います。エンドユーザーのマシンでQtまたはVTKライブラリをあらかじめインストールする必要はありません。私はCMakeLists.txtファイルを修正することでこれを行うことは可能だと思いますが、ウェブ検索は私に正しい方向を指摘していません。

CMakeを使用してWindows用の配布可能パッケージを作成するには?

+0

を要求し、これらのコンポーネントを検索しますか?まずWindows上で全部をコンパイルしてみてください。それがうまくいくならば、パッケージングに行きます。 'cpack'と' cpack-nsis'を見てください。 – Anonymous

答えて

1

自分のプロジェクトで行ったことは、VTKのcmake-variablesとQT_LIBRARIES変数から.soファイルまたは.dllファイルを得る小さなスクリプトを書いています。

その後、これらの.dllまたは.soファイルをインストールターゲット(以下のサンプルスクリプト)に追加し、インストールターゲットはそれらの.dllまたは.soファイルをVTK_DIRまたはQTDIRから$ {CMAKE_INSTALL_PREFIX} \ binにコピーします。これはCPackと互換性があるので、少しのcpackスクリプトも書くことができます。

注意は、しかし、あなたがWindows上でもう少し必要であることをエンドユーザーの自己完結型パッケージを取得する:あなたはまた、「システム・ライブラリ」が必要になります(MSVCRT.DLL、msvcrp.dllまたはmingwm10。 dll、libstdC++。dll)。例えば。 this questionをご覧ください。

Windowsでは、次のスクリプトは、すべて VTK_DIRからのVtk dllを検出します。

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 dllスクリプトも本当に便利でした – CodificandoBits

関連する問題