目录
参考文档
运行环境
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(×tamp);
struct tm *p = localtime(×tamp); //取得当地时间
//(个人拙见)
//这里内容长度是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
网友评论