【Toki从零学CMake】一、构建简单的C语言库

目录

  1. 构建简单的C语言库
  2. 构建可安装的C语言库
  3. 在vcpkg上发布源码库

参考文档

CMake 官方文档
CMake 入门实战

运行环境

2022年12月
MBP M1
macOS Big Sur 11.4
cmake 3.21.3

项目目录

  • 本质上构建项目的代码由CMakeList.txt来指定,所以目录怎么设计都可以,拍平都没问题,我分这么多目录只是为了结构清晰。
  • 把头文件单独放置在开发时会很不方便,但封装发布或者被引用的时候看起来会比较规范。
.
├── CMakeLists.txt
├── demo
│   ├── CMakeLists.txt
│   └── demo.cpp
└── lib
    ├── CMakeLists.txt
    ├── include
    │   └── tkport
    │       └── tkport.hpp
    └── src
        └── tkport
            └── tkport.cpp

库文件

  • 库的源码内容可以自由发挥,我这里实现一个简单的打印函数,后续测试时会比较方便。
// ./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

# 定义文件路径的相关变量
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)

# 添加二进制文件,声明文件名及其源码内容
add_library(
  ${PROJECT_NAME} STATIC
  ${PROJECT_BASE_INCLUDE_LIST}
  ${PROJECT_BASE_SRC_LIST}
)

# 设置编译选项
set_target_properties(
    ${PROJECT_NAME}
    PROPERTIES
    LINKER_LANGUAGE CXX
    CXX_STANDARD 17
)

# 添加头文件引用
target_include_directories(
    ${PROJECT_NAME} PUBLIC
    $<BUILD_INTERFACE:${PROJECT_BASE_INCLUDE}>
)

示例文件

  • 示例内容主要用来构建可执行文件,即一个测试库文件的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
)

根目录文件

  • 用于整合声明、构建库文件和示例文件
# ./CMakeLists.txt

# 本项目构件所须的CMake最低版本号
cmake_minimum_required (VERSION 3.5)

# 配置项目信息
project(
  tkport # 项目名,会被保存到 PROJECT_NAME 变量
  VERSION 0.9.11 # 项目版本号(库版本)
  LANGUAGES CXX # 项目开发语言
)

add_subdirectory(lib)

# 如果构建时BUILD_DEMO参数为true,则构建可执行示例
if(BUILD_DEMO)
  add_subdirectory(demo)
endif()

构建运行

  1. 在根目录创建 build 文件夹
  2. 执行命令
$ cmake -B build -DBUILD_DEMO=true
$ cmake --build build
  1. 检查构建结果
  • 二进制库文件:./build/lib/libtkport.a
  • 可执行示例文件: ./build/demo/demo
  1. 运行主项目可执行文件
$ build/demo
Hellp CMake!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容