cmake 學習小結

2021-07-14 02:13:40 字數 3476 閱讀 7303

假定有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...