CMAKE的學習
下面我們來介紹Cmake
Cmake
我們著重介紹一下CMAKE,是因為CMAKE現在用的人比MAKEFILE多一些,也更好理解,編寫一些。
1 安裝 cmake
1.1 卸載已經安裝的舊版的CMAKE【非必需】
apt-get autoremove cmake
1.2 文件下載解壓:
wget https://github.com/Kitware/CMake/releases/download/v3.24.2/cmake-3.24.2-linux-x86_64.tar.gz
解壓:
tar zxvf cmake-3.24.2-linux-x86_64.tar.gz
查看解壓后目錄:
tree -L 2 cmake-3.24.2-linux-x86_64
1.3 創建軟鏈接
注:文件路徑是可以指定的,一般選擇/opt或/user路徑下,這里選擇/opt
mv cmake-3.24.2-linux-x86_64 /opt/cmake-3.24.2
ln -sf /opt/cmake-3.24.2/bin/* /usr/bin
2 基本exe項目的編譯
2.1 基本工程
first_cmake.cpp
#include<iostream>
int main(int argc ,char* argv[])
{
std::cout<<"my first CmakeProject";
return 0;
}
CMakeLists.txt
#單個目錄實現
#CMAKE最低版本號要求
cmake_minimum_required(VERSION 2.8)
#工程名
PROJECT(GodDragon)
#手動加入文件
SET(SRC_LIST main.c)
MESSAGE(STATUS "THIS IS BINARY DIR"${PROJECT_BINARY_DIR})
MESSAGE(STATUS "THIS IS SOURCE DIR"${PROJECT_SOURCE_DIR})
ADD_EXECUTABLE(0voice ${SRC_LIST})
我們現在WINDOWS平臺下,使用CMAKE編譯一下我們的工程。

現在看看我們生成的文件是什么樣的。

這樣我們第一個cmake WINDOWS項目就這樣完成了
我們現在linux平臺下,使用CMAKE編譯一下我們的工程。

我們可以看到我們生成了我們第一個linux項目。
3.編譯動態庫和靜態庫
編譯靜態庫
xlog.h
//xlog.h
#ifndef XLOG_H
#define XLOG_H
class XLog
{
public:
XLog();
};
#endif
xlog.cpp
#include"xlog.h"
#include<iostream>
XLog::XLog()
{
std::cout<<"XLog()"<<std::endl;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(xlog)
add_library(xlog STATIC xlog.cpp xlog.h)
上面是在編譯我們的動態庫文件。
接下來是測試程序的編寫
main.cpp
#include<iostream>
#include"xlog.h"
using namespace std;
int main(){
XLog log;
cout<<"test \n";
return 0;
}
CMakeLists.txt
#CMakeLists.txt test_xlog 102
cmake_minimum_required(VERSION 3.20)
project(test_xlog)
# 制定頭文件查找路徑
include_directories("../xlog")
# 指定庫查找路徑
link_directories("../xlog/build")
add_executable(test_xlog main.cpp)
# 指定加載的庫
target_link_libraries(test_xlog xlog)
這樣我們就能調用我們編譯的靜態庫了
編譯動態庫
直接修改一下我們的CMakeLists.txt,在我們的項目目錄內生成
#CMakeLists.txt test_xlog xlog 102
cmake_minimum_required(VERSION 3.20)
project(xlog)
include_directories("xlog")
add_library(xlog SHARED ./xlog/xlog.cpp)
add_executable(xlog_test ./xlog_test/main.cpp)
target_link_libraries(xlog_test xlog)
以上就是我們CMAKE基礎入門的知識了。
3. CMAKE提高
3.1 CMAKE的注釋
3.1.1 在3.0以前的注釋,都是#的行注釋
CMakeLists.txt
#這是一條單行注釋
3.1.1 在3.0以后,增加了多行注釋#[[注釋內容]]
CMakeLists.txt
#[[這是一條多行注釋
Hello
]]
3.2 CMAKE的調試打印
3.2.1 基本使用方法
CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(message)
message("參數1")
message("參數p1" "參數p2" "p3")
3.2.2 message的高級使用-指定日志級別 message([<mode>] "message")
它的級別有--log-level = <ERROR|WARNING|NOTICE|STATUS|VERBOSE|DEBUG|TRACE>
輸出的方式 stdout 、stderr
#這是一條單行注釋
#[[這是一條多行注釋
Hello
]]
cmake_minimum_required(VERSION 3.20)
project(message)
message("參數1")
message("參數p1" "參數p2" "p3")
# 進程退出,生成退出
message(FATAL_ERROR "TEST FATAL_ERROR")
# 進程繼續 ,生成退出
message(SEND_ERROR "TEST SEND_ERROR")
#WARNING 打印代碼路徑和行號
message(WARNING "TEST WARNING")
#NOTICE等同于 none也就是不加 message("TEST NOTICE")
message(NOTICE "TEST NOTICE")
#STATUS 加前綴 -- 用戶可能感興趣
message(STATUS "TEST STATUS")
#VEBOSE 默認不顯示 用戶需要的詳細信息
message(VERBOSE "TEST VERBOSE")
#設置日志顯示級別
#cmake -S . -B build --log-level=VERBOSE
message(DEBUG "TEST DEBUG")
message(TRACE "TEST TRACE")
3.3 message模塊查找日志和顯示縮進 message (<checkstate> "msg")
#[[
CHECK_PASS
記錄檢查的成功結果
CHECK_FAIL
記錄不成功的檢查結果
CHECK_START
開始記錄將要執行檢查的結果
]]
#開始查找
message(CHECK_START "Find xcpp")
#查找庫的代碼
#嵌套查找
message(CHECK_START "Find xlog")
#查找XLOG代碼
message(CHECK_PASS "successed!")
#結束查找 查找失敗
message(CHECK_FAIL "Not Found")
3.2 set變量入門和示例
3.2.1 變量語法 set
將一個CMAKE變量設置為給定值
set(<variable> <value>)將變量<variable>的值設置為<value>
如果沒有指定<value>,那么這個變量就會被撤銷而不是被設置。
unset(<variable>)撤銷變量
3.2.2 變量的使用
- 變量引用是值替換,如果未設置變量,返回空字符串
- 變量引用可以嵌套并從內向外求值
- 變量名大小寫敏感
CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(test_ver)
set(VAR1 "測試變量VAR1的值")
message("VAR="${VAR1})
message("VAR1 in string ${VAR1}")
message("\${VAR1}=${VAR1}")
set(VAR2 "VAR1")
message("VAR2=" ${VAR2})
message("VAR2=" ${${VAR2}})
unset(VAR1)
message("\${VAR1}=${VAR1}")
3.2.3 變量讓message輸出不同的顏色
cmake_minimum_required(VERSION 3.20)
project(message_color)
#[[
033[1;31;40m <!--1-高亮顯示 31-前景色紅色 40-背景色黑色-->
033[0m <!--采用終端默認設置,即取消顏色設置-->
顯示方式
0 終端默認設置
1 高亮顯示
4 使用下劃線
5 閃爍
7 反白顯示
8 不可見
前景色 背景色 顏色
---------------------------------------
30 40 黑色
31 41 紅色
32 42 綠色
33 43 黃色
34 44 藍色
35 45 紫紅色
36 46 青藍色
37 47 白色
]]
string(ASCII 27 Esc)
# Esc[0;31m
set(R "${Esc}[0;31m") #紅色
#Esc[0m
set(E "${Esc}[m" ) #結束顏色設置
set(B "${Esc}[1;34m") #藍色高亮
set(RB "${Esc}[1;31;40m") #紅色字體黑色背景
message("${R}紅色內容${E} 默認顏色")
message("${B}藍色內容${E} 默認顏色")
message("${RB}紅色字體黑色背景${E} 默認顏色")
3.3 cmake內建變量
- 提供信息的變量
- 改變行為的變量
- 描述系統的變量
- 控制構建過程的變量
xlog.h
//xlog.h
#ifndef XLOG_H
#define XLOG_H
//__declspec(dllexport)
//__declspec(dllexport) 導出XLog類的函數到lib文件中
// xlog庫文件調用 dllexport
// test_xlog 調用 dllimport
#ifndef _WIN32 //linux mac unix Android
#define XCPP_API
#else //windows
#ifdef xlog_STATIC //靜態庫
#define XCPP_API
#else //動態庫
#ifdef xlog_EXPORTS
#define XCPP_API __declspec(dllexport) //庫項目調用
#else
#define XCPP_API __declspec(dllimport) //調用庫項目調用
#endif
#endif
#endif
class XCPP_API XLog
{
public:
XLog();
};
#endif
xlog.cpp
#include "xlog.h"
#include <iostream>
using namespace std;
XLog::XLog()
{
cout<<"Create XLog"<<endl;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(xlog)
#1 提供信息的變量 項目名稱 ${PROJECT_NAME}對應project的name
#2 改變行為的變量 BUILD_SHARED_LIBS ON 動態庫 OFF靜態庫 默認OFF
#set(BUILD_SHARED_LIBS ON)
set(BUILD_SHARED_LIBS OFF) #靜態庫
#cmake傳遞變量給c++
add_definitions(-Dxlog_STATIC) #默認值1
#3 描述系統的變量
message("MSVC = " ${MSVC})
message("WIN32 = " ${WIN32})
message("UNIX = " ${UNIX})
message("CMAKE_SYSTEM_NAME = " ${CMAKE_SYSTEM_NAME})
# 4 控制構建過程的變量 輸出路徑控制 CMAKE_COLOR_MAKEFILE 是否生成makefile的顏色,默認是ON
set(CMAKE_COLOR_MAKEFILE OFF)
add_library(${PROJECT_NAME} xlog.cpp xlog.h)
3.4 include
從給定的文件中讀取CMake的列表文件
include(file [OPTIONAL][RESULT_VARIABLE VAR])
從給定的文件中讀取CMake的清單文件代碼。在清單文件的命令會被立即處理。如果指定OPTIONAL選項,那么如果包含文件不存在的話,不會報錯。如果指定了RESULT_VARIABLE選項,那么var或者會被設置被包含文件的完整路徑,或是NOTFOUND,表示沒有找到改文件
CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project("cmake_include")
message("begin include")
include("cmake/test_cmake.cmake")
include("cmake/test_cmake.cmake")
include("cmake/test_cmake1.cmake" OPTIONAL) #OPTIONAL 可選,文件不存在不報錯
include("cmake/test_cmake1.cmake" OPTIONAL RESULT_VARIABLE ret) #OPTIONAL 返回值
message("RESULT_VARIABLE ret=${ret}")
message("end include")
cmake/test_cmake.cmake
message("cmake/test_cmake.make")
3.5 自動查找所有源碼文件和頭文件
增加頭文件和代碼后不用修改cmake
aux_source_directory ---- aux_source_directory("./src" LIB_SRCS)#當前路徑下所有源碼 存入 DIR_SRCS
file ---- FILE(GLOB H_FILE "${INCLUDE_PATH}/xcpp/*.h")
FILE(GLOB H_FILE "${INCLUDE_PATH}/*.h<details>
CMakeFileLists.txt
#108auto_src_h/CMakeLists.h
#[[
108auto_src_h
CMakeLists.txt
main.cpp
src
xlog.cpp
xthread.cc
xtest.c
include
xlog.h
xthread.hpp
]]
cmake_minimum_required(VERSION 3.20)
project("auto_src_h")
#頭文件加載路徑
set(INCLUDE_PATH "./include")
include_directories(${INCLUDE_PATH})
# 找到當前目錄(.)下源碼寫入M_SRC變量中
aux_source_directory("." M_SRC)
aux_source_directory("./src" SRC)
#讀取所有的頭文件
file(GLOB H_FILE "${INCLUDE_PATH}/*.h*")
add_executable(${PROJECT_NAME} ${M_SRC} ${SRC} ${H_FILE})
3.6 cmake命令實現程序的分步生成。
從源碼到執行程序
- 預處理
- 編譯
- 匯編
- 鏈接
- 運行---動態庫加載路徑
- cmake程序分步生成、指定項目和清理
我們可以使用 cmake --build . --target help查看我們生成的目標文件
在linux中,預處理會生成.i文件,編譯生成.s文件,然后就會生成.o文件,最后就是直接生成編譯的文件。
3.7 cmake調試打印生成的具體指令
- CMAKE_VERBOSE_MAKEFILE
- cmake --build . -v
第一種方法
# CMakeLists.txt 文件名大小寫不敏
#指定cmake最低版本
cmake_minimum_required(VERSION 3.20)
#構建項目的名稱
project(first_example)
set(CMAKE_VERBOSE_MAKEFILE ON)
#構建執行程序
add_executable(first_cmake first_cmake.cpp)
第二種方法 cmake --build . -v
3.8 cmake設置輸出路徑add_subdirectory
3.8.1 庫輸出路徑
通過設置CMAKE_LIBRARY_OUTPUT_DIRECTORY 這個變量
3.8.2 歸檔輸出路徑
通過設置CMAKE_ARCHIVE_OUTPUT_DIRECTORY 這個變量
3.8.3 執行程序輸出路徑
通過設置CMAKE_RUNTIME_OUTPUT_DIRECTORY 這個變量
CMakeLists.txt
#CMakeLists.txt test_xlog xlog 109cmake_out
cmake_minimum_required(VERSION 3.20)
project(xlog)
include_directories("xlog")
#CMakeLists.txt路徑
message("CMAKE_CURRENT_LIST_DIR = ${CMAKE_CURRENT_LIST_DIR}")
# .so庫輸出路徑 默認路徑在-B build目錄下
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/lib")
#執行程序和dll 動態庫pdb調試文件 輸出路徑
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/bin")
#歸檔輸出路徑 靜態庫 .lib 動態庫.lib地址文件 linux靜態庫.a 靜態庫pdb調試文件
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/lib")
#添加xlog庫編譯 項目自帶預處理變量 xlog_EXPORTS
#add_library(xlog SHARED xlog/xlog.cpp)
set(BUILD_SHARED_LIBS OFF) #靜態庫
#cmake傳遞變量給c++
add_definitions(-Dxlog_STATIC) #默認值1
add_library(xlog xlog/xlog.cpp)
# add_library(xlog_d SHARED xlog/xlog.cpp)
#執行文件
add_executable(test_xlog test_xlog/test_xlog.cpp)
#鏈接庫
target_link_libraries(test_xlog xlog)
使用我們之前的2個代碼的例子,現在還有幾個遺留的問題
- 多個項目不同輸出路徑
- debug和release不同輸出
- 一個項目同時要設置靜態庫和動態庫
3.9 cmake add_subdirectory
./CMakeFileLists.txt
#CMakeLists.txt test_xlog xlog 109cmake_out
cmake_minimum_required(VERSION 3.20)
project(xlog)
include_directories("xlog")
#CMakeLists.txt路徑
message("CMAKE_CURRENT_LIST_DIR = ${CMAKE_CURRENT_LIST_DIR}")
# .so庫輸出路徑 默認路徑在-B build目錄下
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/lib")
#執行程序和dll 動態庫pdb調試文件 輸出路徑
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/bin")
#歸檔輸出路徑 靜態庫 .lib 動態庫.lib地址文件 linux靜態庫.a 靜態庫pdb調試文件
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/lib")
#set(BUILD_SHARED_LIBS OFF) #靜態庫
#cmake傳遞變量給c++
#add_definitions(-Dxlog_STATIC) #默認值1
set(BUILD_SHARED_LIBS ON) #動態庫
add_subdirectory("xlog")
add_subdirectory("test_xlog")
./test_xlog/CMakeLists.txt
#CMakeLists.txt test_xlog 102
cmake_minimum_required(VERSION 3.20)
project(test_xlog)
#指定頭文件查找路徑
include_directories("../xlog")
# 指定庫查找路徑 window自動找 ../xlog/build/Debug ../xlog/build/Release
link_directories("../xlog/build")
add_executable(test_xlog test_xlog.cpp)
# 指定加載的庫
target_link_libraries(test_xlog xlog)
./xlog/CMakeLists.txt
#106cmake_system_ver/CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(xlog)
#3 描述系統的變量
message("MSVC = " ${MSVC})
message("WIN32 = " ${WIN32})
message("UNIX = " ${UNIX})
message("CMAKE_SYSTEM_NAME = " ${CMAKE_SYSTEM_NAME})
# 4 控制構建過程的變量 輸出路徑控制 CMAKE_COLOR_MAKEFILE 是否生成makefile的顏色,默認是ON
set(CMAKE_COLOR_MAKEFILE OFF)
add_library(${PROJECT_NAME} xlog.cpp xlog.h)
4.Cmake常用語法
4.1 cmake if語法說明與常量判斷代碼演示
if基礎表達式
常量
if(
1,ON,YES,TRUE,Y或非零數(包括浮點數),則為真。
0,OFF,FALSE,N,IGNORE,NOTFOUND,空字符串,或者以suffix結尾-NOTFOUND則為假
if(1)
message("1 is true")
endif()
if(0)
message("0 is true?")
else()
message("0 is false")
endif()
if(OFF)
message("OFF is true?")
elseif(NO)
message("NO is true?")
else()
message("OFF ON is False")
endif(OFF)
if()
message("empty is true?")
else()
message("empty is false?")
endif()
if(-1)
message("-1 is true")
endif(-1)
if(123)
message("123 is true")
endif(123)
if(0.1)
message("0.1 is true")
endif(0.1)
if(-NOTFOUND)
message("-NOTFOUND is true")
else()
message("-NOTFOUND is false")
endif(-NOTFOUND)
變量
if(
非假值常量為真。未定義和其他為假。
環境變量總為假
宏參數不是變量
if(VAR_NOT_DEF)
message("VAR_NOT_DEF is true?")
else()
message("VAR_NOT_DEF is false?")
endif(VAR_NOT_DEF)
set(VAR1_TRUE TRUE)
if(VAR1_TRUE)
message("VAR1_TRUE is true!")
endif(VAR1_TRUE)
if(
字符串
字符串的值時常量真則為真
其他帶引號的字符串始終計算為false
if("TRUE")
message("string TRUE is true!")
endif("TRUE")
if("ON")
message("string ON is true!")
endif("ON")
if("test")
message("string test is true!")
else()
message("string test is false!")
endif("test")
if("1234")
message("string 1234 is true!")
endif("1234")
4.2 if邏輯操作符
NOT、AND、OR
邏輯運算符
if(NOT
如果條件不為真,則為真。
if(
如果兩個條件都是真的,則為真。
if(
如果任一條件是真的,則為真。
if((condition) AND (condition OR (condition)))
首先評估括號內的條件,然后評估其余條件。
set(VAR_OFF OFF)
if(NOT VAR_OFF)
message("NOT VAR_OFF(true)")
endif(NOT VAR_OFF)
if(TRUE AND ON)
message("TRUE and ON is true")
endif(TRUE AND ON)
if(TRUE AND OFF)
message("TRUE and OFF is true")
else()
message("TRUE and OFF is false")
endif(TRUE AND OFF)
if(TRUE OR OFF)
message("TRUE or OFF is true")
else()
message("TRUE or OFF is false")
endif(TRUE OR OFF)
if(TRUE AND (OFF OR ON))
message("TRUE AND (OFF OR ON) is true")
endif(TRUE AND (OFF OR ON))
4.3 一元判斷、二元判斷 、正則匹配
一元判斷
- EXISTS
- COMMAND
- DEFINED
set(VAR_DEF OFF)
if(DEFINED VAR_DEF)
message("VAR_DEF is DEFINED")
endif(DEFINED VAR_DEF)
if(DEFINED VAR_NOT_DEF)
message("VAR_NOT_DEF is DEFINED?")
else()
message("VAR_NOT DEF not DEFINED?")
endif(DEFINED VAR_NOT_DEF)
二元判斷
- EQUAL
- EQUAL,LESS,LESS_EQUAL,GREATER,GREATER_EQUAL
- STREQUAL,STRLESS,STRLESS_EQUAL,STRGREATER,STRGREATER_EQUAL
- VERSION_EQUAL,VERSION_LESS,VERSION_LESS_EQUAL,VERSION_GREATER,VERSION_GREATER_EQUAL
set(VAR1 123)
if(VAR1 EQUAL "123")
message("VAR1 EQUAL 123")
endif(VAR1 EQUAL "123")
set(VAR2 "test")
if(VAR2 EQUAL "test")
message("VAR2 EQUAL test")
else()
message("VAR2 not EQUAL test")
endif(VAR2 EQUAL "test")
set(VAR2 "test")
if(VAR2 STREQUAL "test")
message("VAR2 STREQUAL test")
else()
message("VAR2 not STREQUAL test")
endif(VAR2 STREQUAL "test")
if(VAR1 STREQUAL 123)
message("VAR1 STREQUAL 123")
else()
message("VAR1 not STREQUAL 123")
endif(VAR1 STREQUAL 123)
正則匹配
MATCHES if(<variable|string> MATCHES regex)
if("abcd1234" MATCHES "[a-z]+")
message(" \"abcd1234\" MATCHES \"[a-z]+\"")
endif("abcd1234" MATCHES "[a-z]+")
4.4 cmake cache緩存變量設置
設置公式set(<variable> <value>... CACHE <type> <docstring> [FORCE])
type
- BOOL
ON/OFF 選擇框 - FILEPATH 文件選擇
- PATH 目錄選擇
- STRING 字符串
- INTERNAL 內部變量
docstring 變量說明
FORCE 強制修改緩存,不設置第二次調用不改
cmake_minimum_required(VERSION 3.20)
project(cmake_cache)
#設置緩存變量
set(VAR1 "CACHE VAR1" CACHE STRING "cache doc")
#緩存變量第二修改不生效
set(VAR1 "CACHE VAR2" CACHE STRING "cache doc")
message("VAR1 = ${VAR1}")
#強制修改緩存
set(VAR1 "CACHE VAR3" CACHE STRING "cache doc" FORCE)
4.5 普通變量和全局CACHE變量的作用域
# CACHE變量作用域是全局的
# 普通變量的作用域自身和子模塊
set(VAR2_NORMAL "test normal")
message("in main")
message("VAR2_NORMAL = ${VAR2_NORMAL}")
4.6 cmake-gui與CACHE緩存變量的各種類型
#BOOl勾選
set(VAR_BOOL1 "ON" CACHE BOOL "VAR bool 001")
set(VAR_BOOL2 "OFF" CACHE BOOL "VAR bool 002")
message("-------------------------------------------")
message("VAR_BOOL1 = ${VAR_BOOL1}")
message("VAR_BOOL2 = ${VAR_BOOL2}")
#選擇文件
set(VAR_FILE "filepath" CACHE FILEPATH "var FILEPATH")
#選擇文件夾
set(VAR_PATH "PATH" CACHE PATH "var PATH")
#內部緩存變量
set(VAR_INTERNAL "INTERNAL" CACHE INTERNAL "var INTERNAL")
4.7 cmake用戶修改該配置和option
option(OPT1 "opt1 doc" OFF)
option(OPT2 "opt2 doc" ON)
在Linux下,我們先進行項目的生成,在用CCMAKE進行生成。
4.8 cmake CACHE覆蓋策略設置
當次政策設置為NEW時,set(CACHE)命令不會從當前范圍中刪除任何同名的普通變量。在以下情況,該OLD行為會從當前作用域中刪除任何同名的普通變量.
cmake_policy(SET CMP0126 NEW)
$CACHE{NVAR1}
cmakelists.txt
#普通變量
set(NVAR1 "normal var1")
#設置緩存變量覆蓋同名普通變量的策略
# OLD 刪除同名普通變量
# NEW 不刪除普通變量,要訪問cache要用 $CACHE{var_name}
cmake_policy(SET CMP0126 NEW)
#cache變量
set(NVAR1 "cache var1" CACHE STRING "cache doc")
message("NVAR1 = \t ${NVAR1}")
message("CACHE{NVAR1} = \t $CACHE{NVAR1}") #直接查找緩存變量
4.9傳遞緩存變量
-D 傳遞緩存變量
cmake內置緩存變量
- BUILD_SHARED_LIBS
- set(BUILD_SHARED_LIBS OFF CACHE BOOL "lib")
- message("BUILD_SHARED_LIB=${BUILD_SHARED_LIBS}")
#命令行傳遞緩存變量
#cmake -S . -B build -D PARA1=para001
message("PARA1 = ${PARA1}")
set(BUILD_SHARED_LIBS OFF CACHE BOOL "so or a")
message("BUILD_SHARED_LIBS = ${BUILD_SHARED_LIBS}")
message("\n=================")
4.10 cmake變量和屬性有什么區別
屬性類似為成員變量
變量類似為全局變量
屬性的語法
set_property(<GLOBAL |
DIRECTORY [<dir>] |
TARGET [<target1> ...] |
SOURCE [<src1> ...]
[DIRECTORY <dirs> ...]
[TARGET_DIRECTORY <targets> ...] |
INSTALL [<file1> ...] |
TEST [<test1> ...] |
CACHE [<entry1> ...] >
[APPEND] [APPEND_STRING]
PROPERTY <name> [<value1> ...])
get_property(<variable>
<GLOBAL |
DIRECTORY [<dir>] |
TARGET <target> |
SOURCE <source>
[DIRECTORY <dir> | TARGET_DIRECTORY <target>] |
INSTALL <file> |
TEST <test> |
CACHE <entry> |
VARIABLE >
PROPERTY <name>
[SET | DEFINED | BRIEF_DOCS | FULL_DOCS])
define_property(<GLOBAL | DIRECTORY | TARGET | SOURCE |
TEST | VARIABLE | CACHED_VARIABLE>
PROPERTY <name> [INHERITED]
[BRIEF_DOCS <brief-doc> [docs...] ]
[FULL_DOCS <full-doc> [docs...] ]
[INITIALIZE_FROM_VARIABLE <variable>])
例子
# 全局屬性
#設置全局屬性
set_property(GLOBAL PROPERTY TEST_GLOBAL "test global 001")
#獲取全局屬性
get_property(val GLOBAL PROPERTY TEST_GLOBAL)
message("TEST_GLOBAL = ${val}")
#訪問子目錄中的全局屬性
add_subdirectory(sub1)
get_property(val GLOBAL PROPERTY SUB1_GLOBAL)
message("SUB1_GLOBAL = ${val}")
#APPEND APPEND_STRING
# APPEND 數組方式添加 TEST_APPEND = append 001;append 002;append 003
set_property(GLOBAL APPEND PROPERTY TEST_APPEND "append 001")
set_property(GLOBAL APPEND PROPERTY TEST_APPEND "append 002")
set_property(GLOBAL APPEND PROPERTY TEST_APPEND "append 003")
get_property(val GLOBAL PROPERTY TEST_APPEND)
message("TEST_APPEND = ${val}")
# APPEND_STRING 字符串拼接 append string 001 append string 002 append string 003
set_property(GLOBAL APPEND_STRING PROPERTY TEST_APPEND_STRING "append string 001 ")
set_property(GLOBAL APPEND_STRING PROPERTY TEST_APPEND_STRING "append string 002 ")
set_property(GLOBAL APPEND_STRING PROPERTY TEST_APPEND_STRING "append string 003 ")
get_property(val GLOBAL PROPERTY TEST_APPEND_STRING)
message("TEST_APPEND_STRING = ${val}")
4.11 cmake define_property屬性說明設置
#get_property SET | DEFINED
set_property(GLOBAL PROPERTY P1 "p1")
get_property(var GLOBAL PROPERTY P1)
message("P1 SET = ${var}")
if(var)
message("P1 is set")
else()
message("P1 not set")
endif()
#只有調用define_property之后才會為1
get_property(var GLOBAL PROPERTY P1 DEFINED)
message("P1 DEFINED = ${var}")
if(NOT var)
message("P1 not defined")
endif()
#定義屬性 不需要賦值
define_property(GLOBAL PROPERTY TEST_DEF BRIEF_DOCS "p1 brief docs")
get_property(var GLOBAL PROPERTY TEST_DEF DEFINED )
message("TEST_DEF DEFINED = ${var}")
4.12 cmake文件屬性和給c++傳遞預處理變量
# cmake傳遞變量給c++
# cmake 預置屬性 COMPILE_DEFINITIONS 傳遞預處理變量(宏變量) -DPARA1 1234
set_property(SOURCE main.cpp PROPERTY COMPILE_DEFINITIONS "PARA1=1234")
add_executable(${PROJECT_NAME} main.cpp)
4.13 cmake目標屬性設置給c++傳遞多個宏
#cmake 目標屬性 目標必須已經存在
set_property(TARGET ${PROJECT_NAME} PROPERTY TVAR "tval")
get_property(var TARGET ${PROJECT_NAME} PROPERTY TVAR)
message("TVAR= ${var}")
#給C++傳遞宏
set_property(TARGET ${PROJECT_NAME} PROPERTY COMPILE_DEFINITIONS "PARA2=\"test_para2\"")
#追加設置
set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY COMPILE_DEFINITIONS "PARA3=\"test_para3\"")
推薦一個零聲學院免費教程,個人覺得老師講得不錯,
分享給大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,
TCP/IP,協程,DPDK等技術內容,點擊立即學習:
服務器
音視頻
dpdk
Linux內核

浙公網安備 33010602011771號