CMake 使用

Undefined443發表於2024-06-06

Practice

mkdir build && cd build  # 建立構建目錄並進入

# 配置專案
cmake ..  # 生成 Makefile
# 也可以提供配置引數...
cmake -DCMAKE_BUILD_TYPE=Release ..
# 配置引數也可以透過 ccmake 修改
ccmake ..  # 按回車修改配置,按 c 生成,按 q 退出
# 修改完記得生成 Makefile

# 編譯專案
cmake --build .

# 安裝專案
cmake --install .
# 也可以指定安裝路徑
cmake --install . --prefix <install_dir>

Learn

CMake Tutorial

set(CMAKE_EXE_LINKER_FLAGS "-static")  # 靜態連結

靜態連結可以防止你的程式在其他機器上找不到動態庫的情況,但是會使得程式體積變大

Qt 程式不用設定這條命令,因為 Qt 程式除了要連結 C++ 標準庫之外,還要連結 Qt 庫,而 Qt 庫無法透過這條命令靜態連結。在 Windows 平臺釋出 Qt 程式之前應該先使用 windeployqt 工具將依賴的 Qt 動態庫複製到程式目錄下。

部署 Qt 程式

windeployqt your_app.exe

rem Bug: 在 Qt 6.5.0 上使用 windeployqt 會出現如下錯誤:
rem Cannot open .: Access is denied.
rem 解決辦法:
windeployqt --no-translations your_app.exe

CMake -static 編譯 | CSDN

# 設定 CMake 版本,應該作為第一條語句
cmake_minimum_required(VERSION 3.25)

# 設定專案名稱、語言、版本號,應該緊跟著 cmake_minimum_required 命令
project(Tutorial VERSION 1.0)  # 指定了專案名和版本號,將隱式建立 Tutorial_VERSION_MAJOR 變數和 Tutorial_VERSION_MINOR 變數

# 設定變數,應該在 add_executable 之前
set(CMAKE_CXX_STANDARD 11 CMAKE_CXX_STANDARD_REQUIRED True) # 設定 C++ 標準

# 生成 Configured 檔案
configure_file(TutorialConfig.h.in TutorialConfig.h)  # 使用 TutorialConfig.h.in 生成 Tutorial.h 檔案,input 檔案中的變數將被自動替換

# 設定可執行檔案以及原始碼
add_executable(Tutorial tutorial.cxx)  # 生成的可執行檔名將為 Tutorial,其原始檔為 tutorial.cxx

# 設定目標檔案的 include 目錄
target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}")  # 新增標頭檔案目錄,PUBLIC 表示所有依賴於 Tutorial 的目標都會繼承這個目錄
# 設定庫檔案以及原始碼
add_library(MathFunctions mysqrt.cxx)

可執行檔名 Tutorial 和專案名 Tutorial 並沒有關係

cmake -S <source_dir> -B <build_dir>  # 配置專案並生成本地構建系統
ccmake <build_dir>  # 使用圖形化介面編輯專案配置

cmake --build <build_dir>  # 呼叫構建系統來編譯/連結專案

cmake_minimum_required()

project()

add_executable()

set()

target_include_directories()


Useful Resources

A Basic Starting Point:該教程包含如何把 configure file 生成到 BIN 目錄下

Adding a Library

Installing and Testing

# 將 CMake 構建的專案安裝到當前目錄下
cmake --install . --prefix .

Adding System Introspection:該教程透過檢查能否編譯一段測試程式來判斷系統是否擁有所需功能

Adding a Custom Command and Generated File:在構建時執行自定義命令,生成檔案,並將其用於構建。

Packaging an Installer

Selecting Static or Shared Libraries

Linux 上的動態庫路徑變數是 LD_LIBRARY_PATH,而 MacOS 上的動態庫路徑變數是 DYLD_LIBRARY_PATH

在 CMakeLists.txt 中指定動態庫路徑:linux 下透過 rpath 解決 cmake 動態編譯後找不到動態連結庫問題
RPATH 簡介以及 CMake 中的處理
我在 MacOS 上使用時沒有用到 $ORIGIN 變數,而是直接指定了動態庫的路徑。

相關文章