1. ホーム
  2. qt

CMakeラーニングサマリー

2022-02-26 15:12:22

<スパン vegagisプロジェクトを想定した場合、プロジェクトのディレクトリ構成は以下のようになります。

#--vegagis



#--src ソースファイルディレクトリ



# ---gui インターフェースプロジェクト、出力タイプ: dll、QtCore、QtGui、QtXml(QT に依存するもの



# |-- プロジェクトに追加したくないソースファイルを持つ保留中のプロジェクト



## クロスプラットフォームで動作させるために、win32 ディレクトリと linux ディレクトリは同じインターフェースのセットを実装し、 win32 は linux ディレクトリをコンパイルせず、linux は win32 ディレクトリをコンパイルしませんが、 プロジェクトには両方のディレクトリが含まれています。



# |--win32での実装



# ---Linux での実装



# |--app アプリケーション, 出力タイプ: exe, それは gui に依存します。



# |--include インストール時にヘッダが出力されるディレクトリ



# |--gui



# |--アプリ



#--binの出力パス、dllとexeを格納する



# ---デバッグ



# |--プラグイン



# |--build CMakeのビルドパスで、生成されたプロジェクトファイルなどを保持します。

#



# vegagisディレクトリのCMakeLists.txt



#///

cmake_minimum_required(version 2.8)

#プロジェクト名



PROJECT(ベガジス)

# プロジェクトファイルでは相対パスを使用する



set(cmake_suppress_regeneration 1)



set(cmake_use_relative_paths on) を設定します。

# IF(A) ELSE() の記述のサポート



set(cmake_allow_loose_loop_constructs オン)

# プロジェクトのトップレベルのパスを定義する



set(projdir ${cmake_current_source_dir})

#ソースファイルのディレクトリを定義する



SET(SRCDIR ${PROJDIR}/src)

# 出力パスの設定



SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)



SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

# インストールパスの設定



SET(CMAKE_INSTALL_PREFIX ${PROJDIR}/bin)

#define ヘッダーのインストールディレクトリ



SET(VGIS_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/headers)

#OSによって異なるパスの設定



IF(WIN32)



 SET(GDAL_HDRS "E:/lib/gdal/include")を実行します。



ELSE()



 SET(GDAL_HDRS "/home/sunsc/gdal/")を実行します。



ENDIF()

# ヘッダーファイルの参照パスを設定する



include_directories(



 ${GDAL_HDRS}



)

# 参照ライブラリのパスを設定する



set(libs ${library_output_path})



link_directories(${libs})を使用します。

# 依存ライブラリ Qt4 を設定する



set(qt_min_version 4.5.2)



FIND_PACKAGE(Qt4 ${QT_MIN_VERSION} COMPONENTS QtCore QtGui QtXml REQUIRED)



include(${qt_use_file})する。

#visio studio のディレクトリグループ化(フィルタ)機能のためのマクロ



macro(source_group_by_dir source_files)



    if(MSVC)



        set(sgbd_cur_dir ${CMAKE_CURRENT_SOURCE_DIR})



        foreach(sgbd_file ${${source_files}})



            文字列(REGEX REPLACE ${sgbd_cur_dir}//(. */))
//1 sgbd_fpath ${sgbd_file})



            文字列(REGEX REPLACE "/(. */)/. *"
//1 sgbd_group_name(グループ名) ${sgbd_fpath})



            string(COMPARE EQUAL ${sgbd_fpath} ${sgbd_group_name} sgbd_nogroup)



            string(REPLACE "/" "//" sgbd_group_nameの${sgbd_group_name})



            if(sgbd_nogroup)



                set(sgbd_group_name "//")



            endif(sgbd_nogroup)



            source_group(${sgbd_group_name} FILES ${sgbd_file})



        endforeach(sgbd_file)



    エンドイフ(MSVC)



endmacro(source_group_by_dir)

#サブディレクトリを追加する



ADD_SUBDIRECTORY(src)

#



# vegagis/srcディレクトリのCMakeLists.txt



#///



ADD_SUBDIRECTORY(gui)です。



ADD_SUBDIRECTORY(アプリ)



# 依存関係を追加する



add_dependencies(app gui)

#



vegagis/src/guiディレクトリのCMakeLists.txtを使用します。



#///

set(target_name gui)

# 定義済みマクロ、-D オプション



add_definitions(-dvmap_gui_lib)

##ui ファイル



SET(GUI_UIS vmapmainwindow.ui)

#ソースファイルのタイプは *.h* と *.c* です。



FILE(GLOB_RECURSE GUI_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/*.c* ${CMAKE_CURRENT_SOURCE_DIR}/*.h*)



#FILE は現在 EXCLUDE のような機能をサポートしていないので、Pending のファイルは前のステートメント leaf に含まれているので、それを削除します。



FILE(GLOB PENDING ${CMAKE_CURRENT_SOURCE_DIR}/pending/*)



LIST(REMOVE_ITEM GUI_SRCS ${PENDING}) # 新しく生成されたGUI_SRCSには、ペンディングディレクトリのソースファイルは含まれません。

#QT MOCに参加するヘッダーファイル



FILE(GLOB_RECURSE GUI_MOC_HDRS vmapview.h transformlistener.hpp)

# リソースqrcファイルを設定する



SET (GUI_RCCS ui.qrc)

qt4_wrap_ui(gui_uis_h ${gui_uis})



qt4_wrap_cpp(gui_moc_srcs ${gui_moc_hdrs})



qt4_add_resources(gui_rcc_srcs ${gui_rccs})

# .ui ファイルの出力先がビルドディレクトリになっているので、${CMAKE_CURRENT_BINARY_DIR}ディレクトリを追加する必要があります。



INCLUDE_DIRECTORIES(${SRCDIR}/gui ${CMAKE_CURRENT_BINARY_DIR})

# プロジェクトに追加する必要があるが、コンパイルする必要がないソースファイルを設定する



IF (WIN32)



 FILE(GLOB_RECURSE PLATFORM_SRC "${CMAKE_CURRENT_SOURCE_DIR}/linux/*")



ELSE()



 FILE(GLOB_RECURSE PLATFORM_SRC "${CMAKE_CURRENT_SOURCE_DIR}/win32/*")



ENDIF()



ファイル(glob_recurse exclude_src ${platform_src})



SET_SOURCE_FILES_PROPERTIES(${EXCLUDE_SRC} PROPERTIES HEADER_FILE_ONLY true) # ソースファイルの属性をコンパイルに参加しないように設定します。

#ソースコードをグループ化する



source_group_by_dir(GUI_SRCS)

#ダイナミックリンクライブラリ



add_library(${target_name}) 共有 ${gui_srcs}. ${gui_uis_h} ${gui_rcc_src} gui_moc_srcs})

target_link_libraries(${target_name} ${qt_libraries})

#//



CMakeLists.txt を #vegagis/src/app の下に置く。



#//



set(target_name app)

<スパン SET(APP_UIS vmapmainwindow.ui)

FILE(GLOB_RECURSE APP_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/*.c* ${CMAKE_CURRENT_SOURCE_DIR}/*.h* )

SET (APP_MOC_HDRS vmapmainwindow.h)

SET (APP_RCCS vmapmainwindow.qrc)

qt4_wrap_ui(app_uis_h ${app_uis})



qt4_wrap_cpp(app_moc_srcs ${app_moc_hdrs})



qt4_add_resources(app_rcc_srcs ${app_rccs})

#ヘッダーファイルの追加



INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${SRCDIR}/apps/qt/${TARGET_NAME})

#ソースファイルのグループ化



source_group_by_dir(APP_SRCS)

#exe アプリケーション



add_executable(${target_name} ${app_srcs} ${app_rcc_srcs} ${app_uis_h} ${app_moc_srcs})

ADD_EXECUTABLE文の後に#TARGET_LINK_LIBRARIES文を記述しないと、リンクエラーになります。



target_link_libraries(${target_name} ${qt_libraries} gui)





#その他



#1. 出力パスの問題



# あなたが出力パスを変更したい場合は、通常、SET(LIBRARY_OUTPUT_PATH XXX)を使用することができますが、WIN32では、それは自動的に${XXX}/デバッグ/リリースディレクトリに置かれ、例えば、プラグインがあり、pluginsサブディレクトリの出力ディレクトリに希望が、もしSET(LIBRARY _OUTPUT_PATH XXX/plugins )に設定すると、ファイル出力ディレクトリが明らかに我々が望むものではないです${XXX}/ plugins /デバッグになるでしょう。この場合、SET_TARGET_PROPERTIES(abc PROPERTIES PREFIX plugins/)のように、PREFIXを設定することが実践的です。同様に、出力パスがDebugとReleaseに関係なく同じに配置されるなら、PREFIXを. /.

#2. ヘッダーファイルは、インストール時のディレクトリ階層に従って格納される



FILE(GLOB_RECURSE HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h*)



foreach (ヘッダー ${headers})



 STRING (REGEX MATCH "(. *)[///]" DIR ${HEADER})



 install(ファイル ${header} 宛先 ${vgis_include_dir}/${dir})



endforeach(ヘッダー ${headers})