Modern CMake 簡單使用
目錄結構
├── CMakeLists.txt
├── main.cpp
└── threadpool
├── CMakeLists.txt
├── threadpool.cpp
└── threadpool.h
第1個CMakeLists.txt
#設定cmake最小版本
cmake_minimum_required(VERSION 3.21)
#設定工程名 版本
project(test_tp VERSION 0.0.1)
message("PROJECT_NAME: ${PROJECT_NAME}")
message("PROJECT_VERSION: ${PROJECT_VERSION}")
message("PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
message("PROJECT_BINARY_DIR: ${PROJECT_BINARY_DIR}")
message("test_tp_VERSION:${test_tp_VERSION}")
message("test_tp_SOURCE_DIR: ${test_tp_SOURCE_DIR}")
message("test_tp_BINARY_DIR:${test_tp_BINARY_DIR}")
if (PROJECT_BINARY_DIR STREQUAL PROJECT_SOURCE_DIR)
message(MARNING "The binary directory of CMake cannot be the same as source directory.")
endif ()
#設定成Release模式
set(CMAKE_BUILD_TYPE Release)
#設定C++標準版本--C++20
set(CMAKE_CXX_STANDARD 20)
#CMAKE_CXX_STANDARD_REQUIRED--默認OFF,表示是否一定要支持你指定的 C++ 標準
#如果為OFF則CMake檢測到編譯器不支持C++20時不報錯,會使用上一版本;為ON則發現不支持報錯,更安全,
set(CMAKE_CXX_STANDARD_REQUIRED ON)
#CMAKE_CXX_EXTENSIONS默認為ON,設為ON表示啟用GCC特有的一些擴展功能;OFF則關閉GCC的擴展功能,只使用標準的C++,
#要兼容其他編譯器(如 MSVC)的專案,都會設為OFF防止不小心用了GCC才有的特性,
set(CMAKE_CXX_EXTENSIONS OFF)
#添加子目錄
add_subdirectory(threadpool)
#設定目標編譯成二進制可執行檔案,檔案名為test_tp
add_executable(test_tp)
#鏈接源檔案
#CMAKE_CURRENT_SOURCE_DIR表示當前CMakeLists.txt所在的目錄
#target_sources(test_tp PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp)
#或者
#aux_source_directory(< dir > < variable >) 查找在某個路徑下的所有源檔案
aux_source_directory(. SRC_LIST) # 搜索當前目錄下的所有.cpp檔案
target_sources(test_tp PRIVATE ${SRC_LIST})
#鏈接庫
target_link_libraries(test_tp PRIVATE ThreadPool)
第2個CMakeLists.txt
message("threadpool CMAKE_CURRENT_SOURCE_DIR: ${CMAKE_CURRENT_SOURCE_DIR}")
#設定作為物件庫(OBJECT)--物件庫類似于靜態庫,但不生成 .a 檔案,只由 CMake 記住該庫生成了哪些物件檔案物件庫是 CMake 自創的,繞開了編譯器和作業系統的各種繁瑣規則,保證了跨平臺統一性,
#SHARED--編譯動態庫--add_library(ThreadPool SHARED)
#STATIC--編譯靜態庫--add_library(ThreadPool STATIC)
add_library(ThreadPool OBJECT)
#查找依賴庫
find_package(Threads REQUIRED)
#鏈接源檔案
#CMAKE_CURRENT_SOURCE_DIR表示當前CMakeLists.txt所在的目錄
target_sources(ThreadPool PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/threadpool.cpp)
#鏈接庫
target_link_libraries(ThreadPool PRIVATE Threads::Threads)
#設定讓參考或者依賴ThreadPool的能自動包含當前目錄
#主要是設定當前庫的頭檔案對依賴它的生效,讓其他依賴這個庫的,能找到相關頭檔案
#INTERFACE意味著消費者需要但生產者不需要的東西
target_include_directories(ThreadPool INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
常用命令:
cmake -B build在原始碼目錄用 -B 直接創建 build 目錄并生成 build/Makefilecmake --build build -j4自動呼叫本地的構建系統在 build 里構建,即:make -C build -j4sudo cmake --build build --target install呼叫本地的構建系統執行 install 這個目標,即安裝
CMAKE_BUILD_TYPE 構建的型別,除錯模式還是發布模式
- CMAKE_BUILD_TYPE 是 CMake 中一個特殊的變數,用于控制構建型別,他的值可以是:
- Debug 除錯模式,完全不優化,生成除錯資訊,方便除錯程式
- Release 發布模式,優化程度最高,性能最佳,但是編譯比 Debug 慢
- MinSizeRel 最小體積發布,生成的檔案比 Release 更小,不完全優化,減少二進制體積
- RelWithDebInfo 帶除錯資訊發布,生成的檔案比 Release 更大,因為帶有除錯的符號資訊
- 默認情況下 CMAKE_BUILD_TYPE 為空字串,這時相當于 Debug,
操作:
- 在配置build時,
cmake -B build -DCMAKE_BUILD_TYPE=Release. 注意:在配置階段可以通過 -D 設定快取變數,第二次配置時,之前的 -D 添加仍然會被保留,也就是如果設定了Release后,要變回Debug,需要再次執行cmake -B build -DCMAKE_BUILD_TYPE=Debug - 在CMakeLists.txt中設定
set(CMAKE_BUILD_TYPE Release)
PUBLIC,PRIVATE,INTERFACE,定義了Target屬性的傳遞范圍
- PUBLIC 對于可執行檔案而言意義不大,對于庫來說,它讓 CMake 知道鏈接這個目標的目標也需要這個,也就是 “我自己要用,其他鏈接我的也要用”,具有傳遞性
- PRIVATE 表示 “我自己用,其他人不用”
- INTERFACE 表示 “我自己不用,其他鏈接我的要用”
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/445576.html
標籤:其他
上一篇:Java基礎——內部類
