目錄
參考文檔
CMake 官方文檔
CMake 入門實(shí)戰(zhàn)
運(yùn)行環(huán)境
2022年12月
MBP M1
macOS Big Sur 11.4
cmake 3.21.3
項(xiàng)目目錄
- 本質(zhì)上構(gòu)建項(xiàng)目的代碼由CMakeList.txt來指定缤底,所以目錄怎么設(shè)計(jì)都可以茵汰,拍平都沒問題捐下,我分這么多目錄只是為了結(jié)構(gòu)清晰弧哎。
- 把頭文件單獨(dú)放置在開發(fā)時(shí)會(huì)很不方便梧田,但封裝發(fā)布或者被引用的時(shí)候看起來會(huì)比較規(guī)范淳蔼。
.
├── CMakeLists.txt
├── demo
│ ├── CMakeLists.txt
│ └── demo.cpp
└── lib
├── CMakeLists.txt
├── include
│ └── tkport
│ └── tkport.hpp
└── src
└── tkport
└── tkport.cpp
庫(kù)文件
- 庫(kù)的源碼內(nèi)容可以自由發(fā)揮,我這里實(shí)現(xiàn)一個(gè)簡(jiǎn)單的打印函數(shù)裁眯,后續(xù)測(cè)試時(shí)會(huì)比較方便鹉梨。
// ./lib/include/tkport/tkport.hpp
#ifndef tkport_hpp
#define tkport_hpp
#include <iostream>
using namespace std;
class tkport {
private:
string message;
public:
tkport(string message);
void show();
};
#endif /* tkport_hpp */
// ./lib/src/tkport/tkport.cpp
#include <tkport/tkport.hpp>
tkport::tkport(string message) {
this->message = message;
}
void tkport::show() {
cout << message << endl;
}
# ./lib/CMakeLists.txt
# 定義文件路徑的相關(guān)變量
set(PROJECT_BASE_INCLUDE ${CMAKE_CURRENT_LIST_DIR}/include)
file(GLOB_RECURSE PROJECT_BASE_INCLUDE_LIST include/**/*.hpp)
file(GLOB_RECURSE PROJECT_BASE_SRC_LIST src/**/*.cpp)
# 添加二進(jìn)制文件,聲明文件名及其源碼內(nèi)容
add_library(
${PROJECT_NAME} STATIC
${PROJECT_BASE_INCLUDE_LIST}
${PROJECT_BASE_SRC_LIST}
)
# 設(shè)置編譯選項(xiàng)
set_target_properties(
${PROJECT_NAME}
PROPERTIES
LINKER_LANGUAGE CXX
CXX_STANDARD 17
)
# 添加頭文件引用
target_include_directories(
${PROJECT_NAME} PUBLIC
$<BUILD_INTERFACE:${PROJECT_BASE_INCLUDE}>
)
示例文件
- 示例內(nèi)容主要用來構(gòu)建可執(zhí)行文件穿稳,即一個(gè)測(cè)試庫(kù)文件的Demo存皂。
// ./demo/demo.c
#include <tkport/tkport.hpp>
int main() {
tkport tkport = tkport("Hellp CMake!");
tkport.show();
return 1;
}
# ./demo/CMakeLists.txt
set(DEMO_NAME demo)
add_executable(${DEMO_NAME} demo.cpp)
target_link_libraries(${DEMO_NAME} ${PROJECT_NAME})
set_target_properties(
${DEMO_NAME}
PROPERTIES
LINKER_LANGUAGE CXX
CXX_STANDARD 17
)
根目錄文件
- 用于整合聲明、構(gòu)建庫(kù)文件和示例文件
# ./CMakeLists.txt
# 本項(xiàng)目構(gòu)件所須的CMake最低版本號(hào)
cmake_minimum_required (VERSION 3.5)
# 配置項(xiàng)目信息
project(
tkport # 項(xiàng)目名,會(huì)被保存到 PROJECT_NAME 變量
VERSION 0.9.11 # 項(xiàng)目版本號(hào)(庫(kù)版本)
LANGUAGES CXX # 項(xiàng)目開發(fā)語(yǔ)言
)
add_subdirectory(lib)
# 如果構(gòu)建時(shí)BUILD_DEMO參數(shù)為true旦袋,則構(gòu)建可執(zhí)行示例
if(BUILD_DEMO)
add_subdirectory(demo)
endif()
構(gòu)建運(yùn)行
- 在根目錄創(chuàng)建 build 文件夾
- 執(zhí)行命令
$ cmake -B build -DBUILD_DEMO=true
$ cmake --build build
- 檢查構(gòu)建結(jié)果
- 二進(jìn)制庫(kù)文件:
./build/lib/libtkport.a
- 可執(zhí)行示例文件:
./build/demo/demo
- 運(yùn)行主項(xiàng)目可執(zhí)行文件
$ build/demo
Hellp CMake!