cmake取消巨集定義 CMake基本使用

2021-10-22 13:41:11 字數 2769 閱讀 3394

cmake是個很方便的構建系統。官方的文件寫的很明白,就是有點長。於是,根據自己的使用情況,挑選其中最重要的,簡要說明於下:

cmakelists.txt的編寫

cmakelists.txt的命令不區分大小寫。

基本結構

# 最低版本宣告,如果本機的cmake版本小於這個,會告警

cmake_minimum_required(version 3.10)

# set the project name

project(tutorial)

# add the executable

add_executable(tutorial tutorial.cxx)

# 生成庫

# add_library( mymath static mymath.cpp)

注:add_executable和add_library可以原始碼列表,原始碼檔案可以在後面通過target_sources新增。因為target_***_***的命令要求target先定義好,所以這一功能挺重要。

子目錄新增子目錄前,需要先為子目錄編寫cmakelists.txt。

add_subdirectory( mathfunctions )

依賴庫指定路徑

link_directories(tutorial "$/lib" )

注:link_directories只對在它後面宣告的target有效。

指定庫target_link_libraries支援多種格式,以libopus.a為例

target_link_libraries(tutorial opus)

target_link_libraries(tutorial -lopus)

target_link_libraries(tutorial libopus.a)

# 全路徑

target_link_libraries(tutorial $/lib/libopus.a)

如果不是全路徑模式,需要先指定路徑。

注:target_link_libraries加入的順序非常重要。比如tutorial依賴liba.a, liba.a依賴libb.a。那麼liba.a需要放在libb.a之前,不然會報錯,說libb.a的符號找不到。據說是有乙個選項,會盡量去掉沒使用的符號。如果先寫libb.a,則鏈結libb.a時發現沒有人在使用它,就把它去掉了。不過是啥選項沒研究,預設行為,還是注意下順序吧。

巨集定義target_compile_definitions(foo public foo)

target_compile_definitions(foo public -dfoo) # -d removed

target_compile_definitions(foo public "" foo) # "" ignored

target_compile_definitions(foo public -d foo) # -d becomes "", then ignored

#定義帶值的

target_compile_definitions( tutorial private "log_level=2" )

設定變數

#直接設定

set(lib_src src/mymath.cpp src/myadd.cpp ...)

#在原值後面增加

set(lib_src "$" src/mymath.cpp src/myadd.cpp ...)

編譯選項

#c,c++都啟用的編譯選項

add_compile_options(-wall -wextra -pedantic -werror)

add_compile_options(-g)

#設定c編譯選項

set(cmake_c_flags "$ -wall -os -g)

#設定c++編譯選項

set(cmake_cxx_flags "$" -std=c++11 -wall -os -g)

條件生成

if(win32)

***elseif(android)

***elseif(ios)

***endif

target的生成位址

set(cmake_library_output_directory $)

set(cmake_archive_output_directory $)

增加install

install( targets tutorial destination bin)

#安裝標頭檔案

install( files $/config.h destination include )

有了這個以後,就可以用make install安裝了

列印資訊

寫了cmakelists.txt,卻不能正常工作的時候,你一定想列印一些資訊,看看到底是哪兒錯了。於是message命令就派上了用場:

message("build lib ok !")

message( "use_mymath:$")

cmake命令

預設情況

cmake 原始碼目錄

make

傳遞引數

-d表示設定變數

-u表示取消變數

cmake -dcmake_install_prefix=/opt/the/prefix

-umypackage_dir

生成xcode或者vs專案

#xcode專案

cmake ./src -gxcode

#vs專案

cmake ./src -g"visual studio 12 2013"

CMake 常用巨集分享

在本人多年的cmake使用過程中,有兩個自定義巨集被廣泛且頻繁使用。分別是 根據專案目錄結構,分組顯示c 檔案,實現目錄結構與專案結構的對應。macro group files macro group files src files root path set cur dir foreach gro...

cmake中巨集的使用

首先貼乙個例子進行分析 set var abc macro moo arg message arg set arg abc message after change the value of arg.message arg endmacro message call macro moo 這段使用cm...

CMake系列教程1 初始CMake

cmake 是乙個跨平台的安裝 編譯 工具,可以用簡單 統一的語句來描述所有平台的安裝或編譯過程。能夠輸出不同編譯器的 makefile 或 project 檔案。cmake 的使用 cmakelists.txt 作為專案組織檔案,cmake 並非跨平台編譯工具,而是專案構建工具,可以在不同的平台上...