CMakeラーニングサマリー
<スパン 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})
関連
-
[解決済み] QDateTime::fromStringの使い方は?
-
[解決済み] QAbstractTableModelの内部にデータを設定する方法
-
[解決済み] QVariant::UserType 型の QVariant が期待された型であることを確認するにはどうすればよいですか?
-
[解決済み] Qml タイマーが正しい間隔で起動しない
-
[解決済み] Qtのフォームレイアウト機構を理解する
-
[解決済み] QMLイメージの表示サイズを調整する
-
[解決済み] QTextEditの内容を表示するQTextBrowserを持つにはどうしたらよいですか?
-
Qt signal and slot usage error : error: no matching function for call to ...... Qt signal and slot usage error : error: no matching function for call to ...... Qt signal and slot usage error: error
-
不完全な型「クラスUi-Widge't」の無効な使用に対する解決策
-
Qt: (クラス名)::connect()への呼び出しに一致する関数がない エラー概要
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン