CMake 是一個跨平臺的構建工具,用于生成適合不同平臺和編譯器的構建系統文件(如 Makefile 或 Visual Studio 項目文件)。
在 Windows 下使用 CMake
構建項目時,CMake 會根據 CMakeLists.txt
文件生成適合 Windows 的構建系統文件(如 Visual Studio 項目文件)。以下是 Windows 下使用 CMake 的基本規則和步驟:
https://subingwen.cn/cmake/CMake-primer/#1-CMake%E6%A6%82%E8%BF%B0
1. CMakeLists.txt 文件的基本結構
CMakeLists.txt
是 CMake 的配置文件,用于定義項目的構建規則。以下是一個簡單的示例:
# 指定 CMake 的最低版本要求(不是必須的,這個version需要比本地使用的低就行)
cmake_minimum_required(VERSION 3.10)# 定義項目名稱和使用的編程語言(不寫默認情況支持所有語言) project(<PROJECT-NAME> [<language-name>...])
project(MyProject CXX)# 添加可執行文件目標 add_executable(可執行程序名 所有源文件名稱.cpp)
add_executable(MyProgram main.cpp utils.cpp)# 添加編譯選項
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O2")# 添加庫文件(如果需要)
target_link_libraries(MyProgram some_library)# 注釋單行行(# ) 注釋多行CMake 使用 #[[ ]] 形式進行塊注釋
#[[ 這是一個 CMakeLists.txt 文件。
這是一個 CMakeLists.txt 文件
這是一個 CMakeLists.txt 文件]]
set使用
定義變量
# 假設有很多.cpp文件,這些.cpp文件名需要被反復使用,每次都直接將它們的名字寫出來很麻煩,此時可以定義一個變量,將文件名對應的字符串存儲起來
# SET 指令的語法是:VAR:變量名 VALUE:變量值
set (var value)
set(SRC_LIST add.c div.c main.c mult.c sub.c)# 取值 ${變量名}
add_executable(app ${SRC_LIST}) # 生成可執行程序
指定使用的C++標準
# 在編寫C++程序的時候,可能會用到C++11、C++14、C++17、C++20等新特性,那么就需要在編譯的時候在編譯命令中制定出要使用哪
#增加-std=c++11
set(CMAKE_CXX_STANDARD 11)
#增加-std=c++14
set(CMAKE_CXX_STANDARD 14)
#增加-std=c++17
set(CMAKE_CXX_STANDARD 17)
指定輸出的路徑
# 定義一個變量用于存儲一個絕對路徑
set(HOME /home/robin/Linux/Sort)
# 拼接好的路徑值設置給CMAKE_RUNTIME_OUTPUT_DIRECTORY 宏,設置可執行程序輸出目錄
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${HOME}/bin)# 設置庫文件的輸出目錄
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "D:/learn/C++/test/code/lib")# 設置靜態庫文件的輸出目錄
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "D:/learn/C++/test/code/lib")# 定義可執行文件
add_executable(MyProgram main.cpp)
# 為特定目標設置輸出目錄
set_target_properties(MyProgram PROPERTIESRUNTIME_OUTPUT_DIRECTORY "D:/learn/C++/test/code/bin"
)
搜索文件
如果一個項目里邊的源文件很多,在編寫CMakeLists.txt文件的時候不可能將項目目錄的各個文件一一羅列出來,這樣太麻煩也不現實。所以,在CMake中為我們提供了搜索文件的命令,可以使用file命令。
# GLOB: 將指定目錄下搜索到的滿足條件的所有文件名生成一個列表,并將其存儲到變量中。
# GLOB_RECURSE:遞歸搜索指定目錄,將搜索到的滿足條件的文件名生成一個列表,并將其存儲到變量中file(GLOB/GLOB_RECURSE 變量名 要搜索的文件路徑和文件類型)
file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) # CMAKE_CURRENT_SOURCE_DIR 這個存儲路徑就是cmakefile.txt所在的路徑
# file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
# file(GLOB MAIN_HEAD ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h)
指定頭文件
如果頭文件所在目錄發生改變,不需要把引用該頭文件所有的.cpp都進行修改,只需要需要對應的cmake文件
include_directories(headpath)
include_directories(${PROJECT_SOURCE_DIR}/include)
通過CMake 制作庫文件(動態庫/靜態庫)
制作靜態庫
add_library(庫名稱 STATIC 源文件1 [源文件2] ...)
制作動態庫
add_library(庫名稱 SHARED 源文件1 [源文件2] ...)
# 設置動態庫生成路徑
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)# 設置動態庫/靜態庫生成路徑
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
鏈接庫
鏈接靜態庫
link_libraries(<static lib> [<static lib>...])
- 參數1:指定出要鏈接的靜態庫的名字
可以是全名 libxxx.a 也可以是掐頭(lib)去尾(.a)之后的名字 xxx
鏈接動態庫
2. Windows 下的 CMake 使用步驟
(1) 安裝 CMake
- 從 CMake 官網 下載并安裝 CMake。
- 確保將 CMake 添加到系統環境變量中,以便在命令行中使用。
(2) 創建構建目錄
在項目根目錄下(CMakeLists.txt文件所在路徑),創建一個構建目錄(例如 build
),用于存放生成的構建文件:
mkdir build
cd build
(3) 生成構建系統文件(執行cmake進行編譯)
使用 CMake 生成適合 Windows 的構建系統文件。以下是幾種常見的方式:
-
生成 Visual Studio 項目文件:
cmake -G "Visual Studio 17 2022" ..
這里的
"Visual Studio 17 2022"
是生成器的名稱,可以根據你的 Visual Studio 版本調整。 -
指定平臺(x64 或 x86):
如果需要指定目標平臺(如 64 位或 32 位),可以使用-A
參數:cmake -G "Visual Studio 17 2022" -A x64 ..
(4) 構建項目
生成構建系統文件后,可以使用以下命令構建項目:
-
使用 Visual Studio 構建:
打開生成的.sln
文件,使用 Visual Studio 進行構建。 -
使用 CMake 命令行構建:
cmake --build . --config Release
這里的
--config Release
指定構建類型為 Release,也可以改為Debug
。
3. CMakeLists.txt 的常用規則
(1) 添加源文件
# 手動指定源文件
add_executable(MyProgram main.cpp utils.cpp)# 自動查找所有 .cpp 文件
file(GLOB SOURCES "src/*.cpp")
add_executable(MyProgram ${SOURCES})
(2) 添加頭文件目錄
# 添加頭文件目錄
include_directories(include)# 或者使用 target_include_directories(推薦)
target_include_directories(MyProgram PUBLIC include)
(3) 鏈接庫文件
# 鏈接靜態庫或動態庫
target_link_libraries(MyProgram some_library)# 查找并鏈接系統庫(如 OpenGL)
find_package(OpenGL REQUIRED)
target_link_libraries(MyProgram OpenGL::GL)
(4) 設置編譯選項
# 設置全局編譯選項
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O2")# 設置目標特定的編譯選項
target_compile_options(MyProgram PRIVATE -Wall -O2)
(5) 設置輸出目錄
# 設置可執行文件的輸出目錄
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)# 設置庫文件的輸出目錄
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
(6) 添加子目錄
如果項目包含多個子項目,可以使用 add_subdirectory
:
add_subdirectory(subproject)
4. Windows 下的注意事項
(1) 路徑分隔符
在 Windows 下,路徑分隔符是反斜杠 \
,但在 CMake 中建議使用正斜杠 /
,因為 CMake 會自動處理路徑。
(2) 生成器選擇
Windows 下常用的生成器包括:
Visual Studio 17 2022
:生成 Visual Studio 項目文件。MinGW Makefiles
:生成適用于 MinGW 的 Makefile。
(3) 動態鏈接庫
在 Windows 下,動態鏈接庫(DLL)的使用需要注意:
- 確保 DLL 文件在運行時可以被找到(可以將其放在可執行文件目錄中)。
- 使用
target_link_libraries
鏈接庫時,CMake 會自動處理導入庫(.lib
文件)。
(4) 調試與發布配置
CMake 支持多配置生成器(如 Visual Studio),可以通過 --config
參數指定構建類型:
cmake --build . --config Debug # 調試模式
cmake --build . --config Release # 發布模式
5. 示例:完整的 CMakeLists.txt
以下是一個完整的 CMakeLists.txt
示例:
cmake_minimum_required(VERSION 3.10)
project(MyProject CXX)# 添加頭文件目錄
include_directories(include)# 添加源文件
file(GLOB SOURCES "src/*.cpp")# 生成可執行文件
add_executable(MyProgram ${SOURCES})# 鏈接庫文件
target_link_libraries(MyProgram some_library)# 設置編譯選項
target_compile_options(MyProgram PRIVATE -Wall -O2)# 設置輸出目錄
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
6. 總結
- 在 Windows 下使用 CMake 時,可以通過
-G
參數指定生成器(如 Visual Studio)。 CMakeLists.txt
文件定義了項目的構建規則,包括源文件、頭文件、庫文件和編譯選項。- 使用
cmake --build
可以方便地構建項目。
通過合理配置 CMakeLists.txt
,可以在 Windows 下高效地管理和構建項目。