美文网首页
【Toki从零学CMake】构建简单的C语言库

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

作者: TokiHunter | 来源:发表于2021-11-10 17:47 被阅读0次

目录

  1. 构建简单的C语言库
  2. 构建可安装的C语言库

参考文档

CMake 官方文档
CMake 入门实战

运行环境

2021年11月
MBP M1
macOS Big Sur 11.4

项目目录

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

.
├── include # 头文件合集
│   └── date.h
│── library # 实现文件合集
│   ├── CMakeLists.txt
│   └── date.c
├── CMakeLists.txt # 主要构件文件
└── main.c # Demo

库主体

库的主体内容可以自由发挥,不过推荐实现一个有返回值的函数,后续测试时会比较方便。
这里我实现了一个的简单的日期字符串生成函数,可供参考。

#./include/date.h

#ifndef DATE_H
#define DATE_H

char *now();

#endif //DATE_H
#./library/date.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>

#include "date.h"

char *now() {
    time_t timestamp;
    time(&timestamp);

    struct tm *p = localtime(&timestamp); //取得当地时间
    
    //(个人拙见)
    //这里内容长度是19,但申请了长度为20的内存;
    //多出来一个字符存放0是为了避免与其他内存相连,导致外层读取到的字符串异常
    size_t date_len = 20;
    char *date = malloc(date_len);
    memset(date, 0, date_len);
    sprintf(date, "%04d_%02d_%02d_%02d_%02d_%02d", 
        (1900+p->tm_year),
        (1+p->tm_mon),
        p->tm_mday, 
        p->tm_hour,
        p->tm_min, 
        p->tm_sec
    );
    return date;
}

库配置文件

这里的配置文件用于构建项目中的实现文件,即./library目录下的 *.c 文件。

# ./library/CMakeLists.txt

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

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

# 这里添加一个自定义变量,用来定义SO版本(API版本)
set(DATE_SOVERSION 1)

# 查找目录下的所有源文件,并将名称保存到 src_list 变量
aux_source_directory(. src_list)
# 可以通过下面一行的代码检查src_list 中存储的文件有哪些
# message(${src_list})

#构建静态包 date.a
add_library(${PROJECT_NAME} STATIC ${src_list})

主项目内容

这部分内容主要用来构建可执行文件,即一个测试库文件的Demo。

#./main.c
#include <stdio.h>

#include "date.h"

int main(int argc, char *argv[]) {
    printf("当前时间:%s\n", now());
    return 0;
}

主项目配置文件

这里的配置文件用于构建整个项目,包括 Demo。

# ./CMakeLists.txt

cmake_minimum_required (VERSION 3.5)

project (demo)

# 生成可执行文件
add_executable(demo main.c)

# 引用date库的头文件;
# 引用路径 "./include" 等价于将 "./include" 目录下所有文件置于引用空间中;
# 可以使用 #include "xxx.h" 或 #include "xx/xxx.h" 的方式引用
set(DATE_INCLUDE "./include")
include_directories(${DATE_INCLUDE})

# 构建date库,构建指定路径下的 CMakeLists.txt;
# "./library" 路径下的 CMakeLists.txt 会构建 date 库,并存放于指定的构建目录;
# 生成的 date 库可以通过 date 这个名字被其他库 link
set(DATE_LIBRARY "./library")
add_subdirectory(${DATE_LIBRARY})

# 链接 date 库到 demo 的可执行文件;
# 确保 demo 引用 date 库函数时可以找到函数的实现内容
target_link_libraries(demo date)

构建运行

1、在根目录创建 build 文件夹
2、构建CMake脚手架,后面要用该脚手架来编译项目的代码

$ cmake -B build

3、通过 build 文件夹内的脚手架编译项目代码(该命令行参考自VSCode的CMake插件)

$ cmake --build build --config Debug --target all -j 10 --

4、检查构建结果

  • 库二进制文件:build/date/library/libdate.a
  • 主项目可执行文件: build/demo

5、运行主项目可执行文件

$ build/demo
当前时间:2021_11_10_18_30_00

相关文章

网友评论

      本文标题:【Toki从零学CMake】构建简单的C语言库

      本文链接:https://www.haomeiwen.com/subject/evfizltx.html