假定有vegagis工程,工程的目錄結構如下:
##vegagis目錄下的cmakelists.txt
#///
cmake_minimum_required(version 2.8)
#工程名
project(vegagis)
#工程檔案中使用相對路徑
set(cmake_suppress_regeneration 1)
set(cmake_use_relative_paths on)
#支援if(a) else()的寫法
set(cmake_allow_loose_loop_constructs on)
#定義工程的頂級路徑
set(projdir $)
#定義源檔案目錄
set(srcdir $/src)
#設定輸出路徑
set(executable_output_path $/bin)
set(library_output_path $/bin)
#設定安裝路徑
set(cmake_install_prefix $/bin)
#定義標頭檔案安裝目錄
set(vgis_include_dir $/headers)
#根據作業系統不同而設定不同的路徑
if(win32)
set(gdal_hdrs "e:/lib/gdal/include")
else()
set(gdal_hdrs "/home/sunsc/gdal/")
endif()
#設定標頭檔案的引用路徑
include_directories($)
#設定引用庫路徑
set(libs $)
link_directories($)
#設定依賴庫qt4
set(qt_min_version 4.5.2)
find_package(qt4 $ components qtcore qtgui qtxml required)
include($)
#巨集,實現visio studio的目錄分組(過濾器)功能
macro(source_group_by_dir source_files)
if(msvc)
set(sgbd_cur_dir $)
foreach(sgbd_file $})
string(regex replace $//(.*/) //1 sgbd_fpath $)
string(regex replace "/(.*/)/.*" //1 sgbd_group_name $)
string(compare equal $ $ sgbd_nogroup)
string(replace "/" "//" sgbd_group_name $)
if(sgbd_nogroup)
set(sgbd_group_name "//")
endif(sgbd_nogroup)
source_group($ files $)
endforeach(sgbd_file)
endif(msvc)
endmacro(source_group_by_dir)
#新增子目錄
add_subdirectory(src)
##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 $/*.c* $/*.h*)
#file目前還不支援類似exclude的特性,所以pending中的檔案在上一語句中葉包括了,我們刪除它
file(glob pending $/pending/*)
list(remove_item gui_srcs $) #新生成的gui_srcs就不包括pending目錄的原始檔了
#參與qt moc的標頭檔案
file(glob_recurse gui_moc_hdrs vmapview.h transformlistener.hpp)
#設定資源qrc檔案
set (gui_rccs ui.qrc)
qt4_wrap_ui(gui_uis_h $)
qt4_wrap_cpp(gui_moc_srcs $)
qt4_add_resources(gui_rcc_srcs $)
#由於.ui檔案輸出路徑是在build目錄下,所以需要新增$目錄
include_directories($/gui $)
#設定需要加入到工程中,但是不需要編譯的原始檔
if (win32)
file(glob_recurse platform_src "$/linux/*")
else()
file(glob_recurse platform_src "$/win32/*")
endif()
file(glob_recurse exclude_src $)
set_source_files_properties($ properties header_file_only true) #設定源檔案屬性為不參與編譯
#進行源**分組
source_group_by_dir(gui_srcs)
#動態鏈結庫
add_library($ shared $ $ $ $)
target_link_libraries($ $)
#target_link_libraries語句必須放到add_executable語句之後,否則引起鏈結錯誤
target_link_libraries($ $ gui)
#其他#1、輸出路徑的問題
#如果要修改輸出路徑,通常採用set(library_output_path ***)即可,但是在win32下,會自動放到$/debug/release目錄下,比如有乙個外掛程式,希望在輸出目錄的plugins子目錄下,但是如果設定為set(library_output_path ***/plugins),則檔案輸出目錄為$/plugins/debug,這顯然不是我們希望的。做法是設定prefix,如set_target_properties(abc properties prefix plugins/)。同理,如果輸出路徑不管debug、release都放置一樣,則設定prefix為../。
#2、標頭檔案安裝時按照目錄層次存放
file(glob_recurse headers relative $ *.h*)
foreach (header $)
string(regex match "(.*)[///]" dir $)
install(files $ destination $/$)
endforeach(header $)
CMAKE的學習筆記 初始CMAKE
cmake是乙個很強大的編譯工具 最近在看brpc,發現其中的編譯部分都是cmake來完成的,在囫圇吞棗編譯出第乙個demo後,我覺得自己該學習一下cmake了。1 及其簡單的例子 任何東西都是從hello world開始的,cmake也不例外,這裡就是乙個非常簡單的cmake 請注意,檔名必須是c...
CMake學習筆記
cmake是乙個跨平台的安裝編譯工具,能夠生成各種各樣的makefile或者project檔案。cmake並不直接構建出最終的軟體,而是產生標準的構建檔案 即工程檔案,如unix下的makefile或windows下的c project檔案 然後構建者就可以使用平台的ide環境進行常規構建了。在wi...
學習CMake使用
mkdir buidl cd build cmake make 編寫cmakelists.txt cmake minimum required version 2.8 project demo 可執行檔案的名稱 add executable main main.c 在前面cmakelists.txt...