ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

【AI大模型接入SDK】ChatSDK:CMake构建静态库完整实现

2026/10/1 10:48:44 拓冰建站 浏览量
【AI大模型接入SDK】ChatSDK:CMake构建静态库完整实现 个人主页艾莉丝努力练剑❄专栏传送门《C语言》《数据结构与算法》《C/C干货分享学习过程记录》《Linux操作系统编程详解》《笔试/面试常见算法从基础到进阶》《Python干货分享》⭐️为天地立心为生民立命为往圣继绝学为万世开太平 艾莉丝的简介文章目录1 ~ ChatSDK CMake 构建静态库完整实现1.1 业务目标1.2 两种源文件管理方式1.2.1 手动枚举源文件1.2.2 file (GLOB_RECURSE) 自动收集源码1.3 sdk/CMakeLists.txt 完整正确代码1.4 关键依赖宏CPPHTTPLIB_OPENSSL_SUPPORT1.5 编译与安装完整 shell 操作流程1.6 常见报错与排错1.6.1 报错OpenSSL::SSL target was not found1.6.2 cmake 警告cmake_minimum_required should be called prior to project()1.6.3 权限拒绝 Permission denied1.6.4 GLOB_RECURSE 新增源码不编译1.7 SDK 对外使用说明1.8 核心概念补充1.8.1 PUBLIC / PRIVATE / INTERFACE1.8.2 install 参数释义1.8.3 静态库本质结尾1 ~ ChatSDK CMake 构建静态库完整实现1.1 业务目标将 ChatSDK 编译为Linux 静态库.a对外交付产物为头文件 静态库文件。通过make install将库与头文件安装至系统目录/usr/local实现全局可被其他项目直接引用。SDK 目录结构sdk ├─ CMakeLists.txt# SDK的CMake构建脚本├─ include# 对外头文件│ ├─ util │ ├─ ChatGPTProvider.h │ ├─ ChatSDK.h │ ├─ common.h │ ├─ DataManager.h │ ├─ DeepSeekProvider.h │ ├─ GeminiProvider.h │ ├─ LLMManager.h │ ├─ LLMProvider.h │ ├─ OllamaLLMProvider.h │ └─ SessionManager.h └─ src# 实现源文件├─ util ├─ ChatGPTProvider.cpp ├─ ChatSDK.cpp ├─ DataManager.cpp ├─ DeepSeekProvider.cpp ├─ GeminiProvider.cpp ├─ LLMManager.cpp ├─ OllamaLLMProvider.cpp └─ SessionManager.cpp1.2 两种源文件管理方式1.2.1 手动枚举源文件原理在add_executable / add_library中显式罗列全部.cpp源码。优点编译文件清单清晰可控。缺点新增.cpp源文件必须手动修改 CMakeLists.txt 添加遗忘会导致新增文件不参与编译。add_executable(testLLM testLLM.cpp../sdk/src/util/myLog.cpp../sdk/src/DeepSeekProvider.cpp../sdk/src/ChatGPTProvider.cpp../sdk/src/GeminiProvider.cpp../sdk/src/OllamaLLMProvider.cpp../sdk/src/DataManager.cpp../sdk/src/SessionManager.cpp../sdk/src/LLMManager.cpp../sdk/src/ChatSDK.cpp)1.2.2 file (GLOB_RECURSE) 自动收集源码原理递归遍历指定目录通配符匹配后缀文件存入 CMake 变量。注意GLOB 不会监测磁盘文件变更新增源文件需要重新执行cmake ..才会被识别。# 递归收集src目录所有cpp源文件 file(GLOB_RECURSE SDK_SOURCES src/*.cpp) # 递归收集include目录所有h头文件 file(GLOB_RECURSE SDK_HEADERS include/*.h)1.3 sdk/CMakeLists.txt 完整正确代码# CMake最低版本约束必须放在文件最开头cmake_minimum_required(VERSION3.10)# 项目定义project(ai_chat_sdk)# SDK名称变量set(SDK_NAMEai_chat_sdk)# C标准配置set(CMAKE_CXX_STANDARD17)set(CMAKE_CXX_STANDARD_REQUIRED ON)# 构建类型Release发布版本set(CMAKE_BUILD_TYPE Release)# 递归收集源码与头文件file(GLOB_RECURSE SDK_SOURCESsrc/*.cpp)file(GLOB_RECURSE SDK_HEADERSinclude/*.h)# 生成静态库 STATIC代表静态库add_library(${SDK_NAME}STATIC${SDK_SOURCES}${SDK_HEADERS})# 设置编译产物输出目录set(EXECUTABLE_OUTPUT_PATH${CMAKE_CURRENT_SOURCE_DIR}/build)# 头文件搜索路径 PUBLIC使用者也会继承该头文件路径target_include_directories(${SDK_NAME}PUBLIC${CMAKE_CURRENT_SOURCE_DIR}/include)# HTTPS支持宏定义启用cpp‑httplib的OpenSSL能力target_compile_definitions(${SDK_NAME}PUBLIC CPPHTTPLIB_OPENSSL_SUPPORT)# 查找OpenSSL依赖find_package(OpenSSL REQUIRED)# 第三方库搜索路径link_directories(/usr/local/lib)# 链接依赖库target_link_libraries(${SDK_NAME}jsoncppfmtspdlog sqlite3 OpenSSL::SSL OpenSSL::Crypto)########## install安装规则 make install执行时生效 ########### 安装静态库 ARCHIVE专门用于静态库install(TARGETS${SDK_NAME}ARCHIVE DESTINATION lib)# 批量安装头文件复制到/usr/local/include/ai_chat_sdkinstall(DIRECTORY${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION include/ai_chat_sdk FILES_MATCHING PATTERN*.h)关键字说明add_library(xxx STATIC)构建静态库产物lib${SDK_NAME}.a。target_include_directories PUBLIC本库编译、外部使用者编译均可看到该头文件目录PRIVATE 仅本项目内部生效。target_compile_definitions PUBLIC宏定义会传递给链接本 SDK 的上层项目。install TARGETS ... ARCHIVE DESTINATION lib静态库安装到${CMAKE_INSTALL_PREFIX}/lib默认CMAKE_INSTALL_PREFIX/usr/local。install DIRECTORY批量复制 include 下全部.h到系统 include 子目录。1.4 关键依赖宏CPPHTTPLIB_OPENSSL_SUPPORTcpp‑httplib 库默认仅支持 HTTP开启该宏才会引入 OpenSSL 头文件启用 HTTPS 能力。源码逻辑#ifdef CPPHTTPLIB_OPENSSL_SUPPORT分支内才会#include openssl/xxx。宏必须通过target_compile_definitions定义不能写在代码内。1.5 编译与安装完整 shell 操作流程# 进入sdk源码目录cdsdk# 创建构建目录mkdirbuildcdbuild# cmake解析构建脚本cmake..# 编译生成静态库libai_chat_sdk.amake# 安装到系统目录修改/usr/local需要root权限sudomakeinstall安装完成产物位置静态库/usr/local/lib/libai_chat_sdk.a头文件/usr/local/include/ai_chat_sdk/1.6 常见报错与排错1.6.1 报错OpenSSL::SSL target was not found根因find_package(OpenSSL REQUIRED)调用缺失找不到导入目标OpenSSL::SSL。修复CMake 脚本中添加find_package(OpenSSL REQUIRED)放在使用OpenSSL::SSL之前。1.6.2 cmake 警告cmake_minimum_required should be called prior to project()根因cmake_minimum_required()写在了project()之后。修复文件第一行必须写 cmake_minimum_required再写 project 指令。1.6.3 权限拒绝 Permission denied现象直接make install写/usr/local失败。解决方案使用sudo make install提升权限执行安装。1.6.4 GLOB_RECURSE 新增源码不编译根因file (GLOB_RECURSE 仅 cmake 解析阶段扫描一次磁盘后续新增文件不会自动检测。修复新增源文件后重新执行cmake ..再执行 make。1.7 SDK 对外使用说明其他开发者使用该 ChatSDK获取 SDK 源码。创建 build 目录执行cmake .. make sudo make install。使用者项目直接#include ai_chat_sdk/ChatSDK.h链接ai_chat_sdk即可。1.8 核心概念补充1.8.1 PUBLIC / PRIVATE / INTERFACE属性作用域PRIVATE仅当前库编译时生效不会传递给链接者PUBLIC当前库 所有链接该库的上层项目均生效INTERFACE仅链接该库的上层项目生效本库编译不生效1.8.2 install 参数释义ARCHIVE DESTINATION lib专门对应静态库.a。LIBRARY DESTINATION lib专门对应动态库.so/.dylib。RUNTIME DESTINATION bin可执行程序、Windows 下 dll。CMAKE_INSTALL_PREFIX安装根目录默认/usr/localcmake 可通过-DCMAKE_INSTALL_PREFIXxxx修改安装路径。1.8.3 静态库本质Linux 静态库.a本质是.o目标文件归档包链接阶段完整复制库内代码到最终可执行文件。优点部署简单运行时不依赖外部库文件缺点可执行文件体积大库更新需要重新编译链接上层程序。结尾uu们本文的内容到这里就全部结束了艾莉丝在这里再次感谢您的阅读艾莉丝努力练剑C/C Linux 底层探索者 | 一个正在努力练剑的技术博主【关注】跟随我一起深耕技术领域见证每一次成长。❤️【点赞】让优质内容被更多人看见让知识传递更有力量。⭐【收藏】把核心知识点存好在需要时随时查、随时用。【评论】分享你的经验或疑问评论区一起交流避坑不要忘记给博主“一键四连”哦“今日练剑达成”“技术之路难免有困惑但同行的人会让前进更有方向。”结语希望对学习Linux相关内容的uu有所帮助不要忘记给博主“一键四连”哦往期回顾【AI大模型接入SDK】ChatSDK 集成测试概述博主在这里放了一只小狗大家看完了摸摸小狗放松一下吧૮₍ ˶ ˊ ᴥ ˋ˶₎ა