8.CMakeコンパイルQtプロジェクト

2397 ワード

CMakeコンパイルQtプロジェクト
1.背景
Qtプロジェクトでは、qmakeを使用してコンパイルするのが一般的ですが、コンパイル中にソースコードがある程度変更され、CMakeを使用するとこのような悩みはなく、あるいは比較的簡単にコンパイルされます.
ネット上の一言を借りる.
CMake is CMake, others are bullshit.
2.Qt
Qt(/ˈkjuːt/,発音は「cute」)とプラットフォームをまたぐC++アプリケーション開発フレームワークである.GUIプログラムの開発に広く用いられており、この場合は部品ツールボックスとも呼ばれる.コンソールツールやサーバーなどの非GUIプログラムの開発にも使用できます.QtはOPIE、Skype、VLCメディアプレーヤー、Adobe Photoshop Elements、VirtualBoxとMathematica、およびAutodesk、欧州宇宙総署、ドリームファクトリー、Google、HP、KDE、ルーカス映画業、シーメンス子会社、富豪グループ、ウォルトディズニーアニメーション制作会社、三星グループ、フィリップス、Panasonicで使用されている.Digia社の製品です.Qtは、標準的なC++と特殊なコードを使用して拡張子(メタオブジェクトコンパイラ(Meta Object Compiler,moc)といくつかの巨大セットを生成します.言語バインドにより、他のプログラム言語でもQtを使用できます.Qtは自由でオープンなオリジナルコードのソフトで、GNUの比較的ゆとりのある公共ライセンス(LGPL)条項の下で発表されています.すべてのバージョンでは、GCCのC++コンパイラやVisual Studioなど、幅広いコンパイラがサポートされています.Qt-wiki
3.準備
Qt環境構成、ここではQt 4バージョンを使用します.
sudo apt install qt4-default

4.CMakeLists.txt
#         
find_package(Qt4 REQUIRED)
#     
include_directories($(QT_INCLUDES))

#       
#             
set(CMAKE_INCLUDE_CURRENT_DIR ON)
#     moc
set(CMAKE_AUTOMOC ON)
#     uic
set(CMAKE_AUTOUIC ON)
#     rcc
set(CMAKE_AUTORCC ON)

#        
add_executable(main main.cc)
#    
target_link_libraries(main Qt4::QtCore Qt4::QtGui)

これで単一ファイルのQtプロジェクトをコンパイルできます.
5.Qt Designを使用したインタフェース設計
プロジェクトをコンパイルするときはQt Designを使用してインタフェースの設計を行い、完了するとuiファイルが生成されます.このファイルを対応するヘッダに変換する必要があります.CMAKE_AUTOUICONに設定すると、対応するui_xxxxx.hファイルが自動的に生成され、対応するc++ファイルの#include ui_xxxxx.hだけでいいです.
このオプションがオンになっていない場合は、CMakeLists.txtで次のコマンドを使用して手動で生成できます.
qt4_wrap_ui(OUTPUT_FILED INPUT_FILES)

6.複数ファイルの場合
通常、プロジェクトディレクトリの構造を次のように仮定して、異なるインタフェースを異なるファイルに書きます.
├── CMakeLists.txt
├── test.cc
├── test.h
├── test.ui             # ui  
├── main.cc             #        

上記の手順に従って、次のエラーまたはいくつかの関数が宣言されたエラーが発生します.
collect2: error: ld return 1 exit status

関連するファイルをダイナミックライブラリに生成していないため、ライブラリファイルまたは関数宣言が見つかりません.解決策はCMakeLists.txtに次のコマンドを追加することです.
#      
add_library(test_lib SHARED test.cc test.h)
#       
target_link_libraries(test_lib Qt4::QtCore Qt4::QtGui)

#        
add_executable(main main.cc)
#    
target_link_libraries(main test_lib Qt4::QtCore Qt4::QtGui)