php網(wǎng)站模板怎么用今日軍事新聞熱點(diǎn)事件
目錄
- 五、scope 作用域
- 5.1 作用域的類型
- 5.1.1 全局作用域
- 5.1.2 目錄作用域
- 5.1.3 函數(shù)作用域
- 六、宏
- 6.1 基本語(yǔ)法
- 6.2 演示代碼
- 七、CMake構(gòu)建項(xiàng)目
- 7.1 全局變量
- 7.2 寫(xiě)入源碼路徑
- 7.3 調(diào)用子目錄cmake腳本
- 7.4 CMakeLists 嵌套(最常用)
- 八、CMake 與庫(kù)
- 8.1 CMake生成動(dòng)靜態(tài)庫(kù)
- 8.1.1 動(dòng)靜態(tài)庫(kù)
- 8.1.2 常見(jiàn)命令
- 8.1.3 生成靜態(tài)庫(kù)
- 8.1.3.1 示例
- 8.1.3.2 總結(jié)
- 8.1.4 生成動(dòng)態(tài)庫(kù)
- 8.2 CMake調(diào)用動(dòng)靜態(tài)庫(kù)
- 8.2.1 靜態(tài)庫(kù)調(diào)用流程:
- 8.2.2 動(dòng)態(tài)庫(kù)調(diào)用流程:
五、scope 作用域
5.1 作用域的類型
5.1.1 全局作用域
- 從CMake腳本開(kāi)始運(yùn)行到結(jié)束。
- 所有CMakeLists.txt文件共享全局作用域
- 通過(guò)set()定義的變量默認(rèn)是全局變量(除非明確在函數(shù)或宏中設(shè)置為局部變量)
set(GLOBAL_VAR "I am global")
message(${GLOBAL_VAR}) # 輸出: I am global
5.1.2 目錄作用域
- 每個(gè)目錄中的CMakeLists.txt文件有獨(dú)立的作用域
- 子目錄可以繼承父目錄的變量,但子目錄中對(duì)變量的更改不會(huì)影響父目錄,只在子目錄下生效
下面是一個(gè)demo,理解即可,暫時(shí)不嘗試自己編譯:
# 頂層 CMakeLists.txt
set(DIR_VAR "Parent Directory")
# 添加子目錄
add_subdirectory(subdir)
# 子目錄 subdir/CMakeLists.txt
message(${DIR_VAR}) # 輸出: Parent Directory
set(DIR_VAR "Child Directory")
子目錄進(jìn)行set操作后,頂層的 DIR_VAR 不會(huì)被子目錄的更改影響。
5.1.3 函數(shù)作用域
- 在函數(shù)中定義的變量是局部變量,只在函數(shù)內(nèi)有效
- 使用set()定義變量時(shí),作用域局限于當(dāng)前函數(shù),除非指定PARENT_SCOPE
function(set_local_var)set(LOCAL_VAR "Local Scope")message(${LOCAL_VAR}) # 輸出: Local Scope
endfunction()set_local_var()
message(${LOCAL_VAR}) # 輸出: (空,因?yàn)槌龊瘮?shù)作用域)
六、宏
6.1 基本語(yǔ)法
macro(<name> [arg1 [arg2 ...]])# 宏體
endmacro()
- <name> 是宏的名稱。
- [arg1, arg2…] 是參數(shù)列表(可選)。
- 宏沒(méi)有返回值,但可以通過(guò)變量或 CACHE 修改全局狀態(tài)。
6.2 演示代碼
cmake_minimum_required(VERSION 3.20.0)macro(Test myVar)set(myVar "new value")message ("2. argument: ${myVar}")
endmacro()set(myVar "First value")
message ("1. myVar: ${myVar}")
Test("value")
message("3. myVar: ${myVar}")
七、CMake構(gòu)建項(xiàng)目
7.1 全局變量
在[[#1.2 初體驗(yàn)]]中,我們使用了以下代碼:
project(hello CXX)
- 聲明項(xiàng)目名稱為
hello
,并設(shè)置主要語(yǔ)言為 C++(CXX)。 - 生成項(xiàng)目相關(guān)的全局變量,例如:
${PROJECT_NAME}
:值為 hello${PROJECT_SOURCE_DIR}
:項(xiàng)目的根目錄路徑。${PROJECT_BINARY_DIR}
:構(gòu)建目錄路徑。
7.2 寫(xiě)入源碼路徑
特點(diǎn)
- 最簡(jiǎn)單的構(gòu)建方式。
- 適用于只有一個(gè) CMakeLists.txt 文件的小型項(xiàng)目。
目錄結(jié)構(gòu)
MyProject/
├── CMakeLists.txt
├── main.cpp
├──Transportation├──train.h├──tarin.cpp
CMakeLists.txt
cmake_minimum_required(VERSION 3.20.0)project(MyProject CXX)
add_executable(MyProject main.cpp 需要鏈接的文件路徑)
- CXX 表示語(yǔ)言是 cpp
- 在原文件中,要寫(xiě)對(duì)應(yīng)的.h文件,main.cpp:
#include "Transportation/train.h"
,在這里就不需要再包含,但是要包含.cpp文件的路徑
構(gòu)建方法
cmake -B build
cmake --build build
build/項(xiàng)目名稱
7.3 調(diào)用子目錄cmake腳本
- include方法可以引入子目錄中的cmake后綴的配置文件
- 將配置加入 add_executable
目錄結(jié)構(gòu):
.
├── CMakeLists.txt
├── main.cpp
└── Transportation├── car.cpp├── car.h├── train.cpp├── train.h└── transportation.cmake
在transportation.cmake
使用set將變量設(shè)置成需要鏈接的文件:
set(trans_sources Transportation/car.cpp Transportation/train.cpp)
然后在CMakeLists.txt
中就可以直接使用該變量:
cmake_minimum_required(VERSION 3.20.0)
project(MyProject CXX)
include(Transportation/transportation.cmake)
add_executable(MyProject main.cpp ${trans_sources})
??注意:要使用include
引入子目錄下的cmake文件,使用變量要用${}
構(gòu)建方法同上。
7.4 CMakeLists 嵌套(最常用)
- target_include_directories 頭文件目錄的聲明
- target_link_libraries 連接庫(kù)文件
- add_subdirectory 添加子目錄
- add_ library 生成庫(kù)文件(默認(rèn)靜態(tài)庫(kù))
目錄結(jié)構(gòu):
.
├── CMakeLists.txt
├── main.cpp
└── Transportation├── car.cpp├── car.h├── CMakeLists.txt├── train.cpp└── train.h
在子目錄的CMakeLists.txt中,add_library
命令創(chuàng)建一個(gè)名為 Translib
的庫(kù),該庫(kù)包含 train.cpp 和 car.cpp 兩個(gè)源文件的編譯結(jié)果。
add_library(Translib train.cpp car.cpp)
在父目錄的CMakeLists.txt中,
cmake_minimum_required(VERSION 3.20.0)
project(MyProject CXX)add_subdirectory(Transportation)add_executable(MyApp main.cpp)target_link_libraries(MyApp PUBLIC Translib)target_include_directories(MyApp PUBLIC "${PROJECT_SOURCE_DIR}/Transportation")
- 定義項(xiàng)目
- project(MyProject CXX) 聲明項(xiàng)目的名稱為 MyProject,并設(shè)置其主要語(yǔ)言為 C++。
- 添加子目錄
add_subdirectory(Transportation)
將 Transportation 子目錄的構(gòu)建邏輯納入父目錄中。- 這會(huì)遞歸執(zhí)行 Transportation 目錄中的 CMakeLists.txt,構(gòu)建 Translib 庫(kù)。
- 添加可執(zhí)行文件
add_executable(MyApp main.cpp)
聲明一個(gè)名為 MyApp 的可執(zhí)行目標(biāo),其源文件為 main.cpp。
- 鏈接庫(kù)
target_link_libraries(MyApp PUBLIC Translib)
將 Translib 庫(kù)鏈接到可執(zhí)行文件 MyApp。- PUBLIC:表示 Translib 的頭文件路徑和鏈接庫(kù)信息都對(duì) MyProject 和其使用者可見(jiàn)。
- 包含頭文件路徑
target_include_directories(MyApp PUBLIC "${PROJECT_SOURCE_DIR}/Transportation")
明確告訴 CMake,MyProject 需要包含 Transportation 目錄中的頭文件(如 car.h 和 train.h),這樣在main.cpp中包含頭文件時(shí)就不需要再次包含路徑。
構(gòu)建順序總結(jié)
- 進(jìn)入父目錄的構(gòu)建流程:
- cmake 檢測(cè)到 add_subdirectory(Transportation),遞歸構(gòu)建子目錄。
- 子目錄生成 Translib 庫(kù)。
- 構(gòu)建父目錄目標(biāo):
- 構(gòu)建 main.cpp 并將其鏈接到已生成的 Translib。
八、CMake 與庫(kù)
8.1 CMake生成動(dòng)靜態(tài)庫(kù)
8.1.1 動(dòng)靜態(tài)庫(kù)
靜態(tài)庫(kù)
常見(jiàn)命名:.a(Linux/Unix),.lib(Windows)。
在鏈接階段,將匯編生成的目標(biāo)文件.o與引用到的庫(kù)一起鏈接打包到可執(zhí)行文件中。
對(duì)函數(shù)庫(kù)的鏈接是編譯器的鏈接器在編譯階段完成靜態(tài)鏈接的過(guò)程
動(dòng)態(tài)庫(kù)
常見(jiàn)命名:.so(Linux/Unix),.dll(Windows),.dylib(macOS
動(dòng)態(tài)庫(kù)是在程序運(yùn)行時(shí)才會(huì)被載入到內(nèi)存,當(dāng)執(zhí)行到庫(kù)中代碼時(shí)就會(huì)跳轉(zhuǎn)到目標(biāo)庫(kù)。
動(dòng)態(tài)庫(kù)需要依賴操作系統(tǒng)的動(dòng)態(tài)鏈接機(jī)制
8.1.2 常見(jiàn)命令
file(GLOB ...)
常用于搜索源文件add_library(animal STATIC ${SRC})
生成靜態(tài)庫(kù)add_library(animal SHARED ${SRC})
生成動(dòng)態(tài)庫(kù)${LIBRARY_OUTER_PATH}
導(dǎo)出目錄
8.1.3 生成靜態(tài)庫(kù)
8.1.3.1 示例
當(dāng)前目錄結(jié)構(gòu)如下:
.
├── CMakeLists.txt
├── include
│ ├── car.h
│ └── train.h
└── src├── car.cpp└── train.cpp
CMakeLists.txt:
cmake_minimum_required(VERSION 3.20.0)
project(MyProject CXX)file(GLOB SRC &${PROJECT_SOURCE_DIR}/src/*.cpp)
include_directories(${PROJECT_SOURCE_DIR}/include) set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/a)
add_library(trans STATIC ${SRC})
下面來(lái)解釋一下上面的代碼:
project(MyProject CXX)
在[[#7.1 全局變量]]中,我們了解到使用project
時(shí),除聲明項(xiàng)目名稱外,還會(huì)生成項(xiàng)目相關(guān)的全局變量,例如:
${PROJECT_NAME}
:值為 MyProject。${PROJECT_SOURCE_DIR}
:項(xiàng)目的根目錄路徑。${PROJECT_BINARY_DIR}
:構(gòu)建目錄路徑。
file(GLOB SRC ${PROJECT_SOURCE_DIR}/src/*.cpp)
作用
- 使用
file(GLOB ...)
命令,搜索 src 目錄下所有以 .cpp 結(jié)尾的文件,并將它們的路徑存入變量SRC
。 - GLOB 是 CMake 提供的文件搜索命令,用于匹配文件路徑。
- 示例:如果 src 目錄下有 car.cpp 和 train.cpp,那么 SRC 的值將是:
/path/to/src/car.cpp
/path/to/src/train.cpp
include_directories(${PROJECT_SOURCE_DIR}/include)
作用
- 將 include 目錄(即 car.h 和 train.h 所在目錄)添加到項(xiàng)目的頭文件搜索路徑中。
- 等效于將 -I/path/to/include 傳遞給編譯器。
- 這樣,源文件中可以直接使用,而無(wú)需寫(xiě)完整路徑:
#include "car.h"
#include "train.h"
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/a)
作用
- 指定生成的庫(kù)文件的輸出目錄為項(xiàng)目根目錄下的 a 子目錄。
- 如果沒(méi)有這一行,CMake 默認(rèn)將庫(kù)文件輸出到構(gòu)建目錄中。
add_library(trans STATIC ${SRC})
作用
- 定義一個(gè)名為 trans 的靜態(tài)庫(kù)(STATIC)。
- SRC 中列出的源文件(如 car.cpp 和 train.cpp)將被編譯,并打包成靜態(tài)庫(kù)。
8.1.3.2 總結(jié)
生成靜態(tài)庫(kù)的基本步驟:
# 1. 設(shè)置 CMake 最低版本
cmake_minimum_required(VERSION 3.20)
# 2. 定義項(xiàng)目名稱和語(yǔ)言
project(MyStaticLibrary LANGUAGES CXX)# 3. 添加頭文件路徑
include_directories(${PROJECT_SOURCE_DIR}/include)
# 4. 查找源文件
file(GLOB SRC_FILES ${PROJECT_SOURCE_DIR}/src/*.cpp)# 5. 設(shè)置庫(kù)文件的輸出路徑
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/a)# 6. 添加靜態(tài)庫(kù) 聲明一個(gè)靜態(tài)庫(kù)目標(biāo)(STATIC 表示靜態(tài)庫(kù)),指定構(gòu)成靜態(tài)庫(kù)的源文件。
add_library(MyStaticLib STATIC ${SRC_FILES})
8.1.4 生成動(dòng)態(tài)庫(kù)
生成動(dòng)態(tài)庫(kù)與生成靜態(tài)庫(kù)的步驟類似,只需要將添加靜態(tài)庫(kù)的STATIC
改為SHARED
(動(dòng)態(tài)庫(kù)也叫共享庫(kù))
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/so)
add_library(trans SHARED ${SRC})
8.2 CMake調(diào)用動(dòng)靜態(tài)庫(kù)
8.2.1 靜態(tài)庫(kù)調(diào)用流程:
- 指定靜態(tài)庫(kù)的路徑
- 添加可執(zhí)行文件
- 鏈接靜態(tài)庫(kù)
- 添加庫(kù)的頭文件路徑
假設(shè)當(dāng)前目錄如下:
flash@VM-12-10-ubuntu:~/2024/12/14_cmake/useLib$ tree -L 2
.
├── CMakeLists.txt
├── include
│ ├── car.h
│ └── train.h
├── Lib
│ ├── libtrans.a
│ └── libtrans.so
└── main.cpp
如果已經(jīng)生成了動(dòng)靜態(tài)庫(kù),可以直接刪除src目錄,但是建議保留include目錄,下面來(lái)看CMakeLists.txt的具體編寫(xiě):
cmake_minimum_required(VERSION 3.20.0)
project(MyProject CXX)# 指定靜態(tài)庫(kù)的路徑
set(STATIC_LIB_PATH ${PROJECT_SOURCE_DIR}/Lib/libtrans.a)
# 添加可執(zhí)行文件
add_executable(MyExecutable main.cpp)
# 鏈接靜態(tài)庫(kù)(僅作用于 MyExecutable)
target_link_libraries(MyExecutable PRIVATE ${STATIC_LIB_PATH})
# 添加庫(kù)的頭文件路徑(僅作用于 MyExecutable)
target_include_directories(MyExecutable PRIVATE ${PROJECT_SOURCE_DIR}/include)
8.2.2 動(dòng)態(tài)庫(kù)調(diào)用流程:
- 指定動(dòng)態(tài)庫(kù)的路徑
- 添加可執(zhí)行文件
- 鏈接靜態(tài)庫(kù)
- 添加庫(kù)的頭文件路徑
cmake_minimum_required(VERSION 3.20.0)
project(MyProject CXX)# 指定動(dòng)態(tài)庫(kù)的路徑
set(DYNAMIC_LIB_PATH ${PROJECT_SOURCE_DIR}/Lib/libtrans.so)
# 添加可執(zhí)行文件
add_executable(MyExecutable main.cpp)
# 鏈接動(dòng)態(tài)庫(kù)(僅作用于 MyExecutable)
target_link_libraries(MyExecutable PRIVATE ${DYNAMIC_LIB_PATH})
# 添加庫(kù)的頭文件路徑(僅作用于 MyExecutable)
target_include_directories(MyExecutable PRIVATE ${PROJECT_SOURCE_DIR}/include)