CMake 高階編寫

2021-09-10 05:46:45 字數 3476 閱讀 6664

假定有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 minimum required version 2.6 工程名 project websocket 新增頭檔案目錄 include directories include 源檔案目錄 aux source directory src dir srcs 頭檔案目錄 s...

CMake 編寫筆記

cmake官網 cmake minimum required 限定最小cmake版本,例 set 設定變數,例 file 組檔案或資料夾,例 if 判斷,例 message 輸出log,例 include directories 引入頭檔案目錄,使得目錄下的.h hpp檔案可以被引用,例 add e...

Cmake使用筆記,Cmakelist編寫

project languages 將name存到project name,同時設定變數 include directories after before system dir1 dir2 指定標頭檔案的搜尋路徑,相當於指定gcc的 i引數 include directories hello 增加h...