CMake TcpServer项目 生成静态库.a / 动态库.so
CMake 实战构建TcpServer项目 静态库/动态库-CSDN博客
https://blog.csdn.net/weixin_41987016/article/details/135608829?spm=1001.2014.3001.5501 在这篇博客的基础上,我们把头文件放在include里边,把源文件放在src里边,重新构建
heheda@linux:~/Linux/LinuxServerCppInclude$ tree
.
├── CMakeLists.txt
├── common
│ ├── CMakeLists.txt
│ ├── include
│ │ ├── Buffer.h
│ │ ├── Channel.h
│ │ └── Log.h
│ └── src
│ ├── Buffer.cpp
│ └── Channel.cpp
├── http
│ ├── CMakeLists.txt
│ ├── include
│ │ ├── HttpRequest.h
│ │ └── HttpResponse.h
│ └── src
│ ├── HttpRequest.cpp
│ └── HttpResponse.cpp
├── main.cpp
├── reactor
│ ├── CMakeLists.txt
│ ├── include
│ │ ├── Dispatcher.h
│ │ ├── EpollDispatcher.h
│ │ ├── EventLoop.h
│ │ ├── PollDispatcher.h
│ │ └── SelectDispatcher.h
│ └── src
│ ├── Dispatcher.cpp
│ ├── EpollDispatcher.cpp
│ ├── EventLoop.cpp
│ ├── PollDispatcher.cpp
│ └── SelectDispatcher.cpp
├── tcp
│ ├── CMakeLists.txt
│ ├── include
│ │ ├── TcpConnection.h
│ │ └── TcpServer.h
│ └── src
│ ├── TcpConnection.cpp
│ └── TcpServer.cpp
└── thread├── CMakeLists.txt├── include│ ├── ThreadPool.h│ └── WorkerThread.h└── src├── ThreadPool.cpp└── WorkerThread.cpp15 directories, 34 files
heheda@linux:~/Linux/LinuxServerCppInclude$
一、静态库
1.在common文件夹中的CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(common)# 搜索源文件
aux_source_directory(./src/ SRC)
set(LIBRARY_OUTPUT_PATH ${LIBPATH}) # 库生成的路径 LIBPATHadd_library(common STATIC ${SRC}) # 静态库
2.在http文件夹中的CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(http)# 搜索源文件
aux_source_directory(./src/ SRC)
set(LIBRARY_OUTPUT_PATH ${LIBPATH}) # 库生成的路径 LIBPATHadd_library(http STATIC ${SRC}) # 静态库
3.在reactor文件夹中的CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(reactor)
aux_source_directory(./src/ SRC)# 搜索源文件
set(LIBRARY_OUTPUT_PATH ${LIBPATH}) # 库生成的路径 LIBPATHadd_library(reactor STATIC ${SRC}) # 静态库
4.在tcp文件夹中的CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(tcp)link_libraries(common http reactor)
aux_source_directory(./src/ SRC)# 搜索源文件
set(LIBRARY_OUTPUT_PATH ${LIBPATH}) # 库生成的路径 LIBPATHadd_library(tcp STATIC ${SRC}) # 静态库
5.在thread文件夹中的CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(thread)
aux_source_directory(./src/ SRC)# 搜索源文件
set(LIBRARY_OUTPUT_PATH ${LIBPATH}) # 库生成的路径 LIBPATHadd_library(thread STATIC ${SRC}) # 静态库
6.在根目录中的CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(HttpWeb)# 库生成的路径
set(LIBPATH ${PROJECT_SOURCE_DIR}/staticLib)include_directories(${PROJECT_SOURCE_DIR}/common/include)
include_directories(${PROJECT_SOURCE_DIR}/http/include)
include_directories(${PROJECT_SOURCE_DIR}/reactor/include)
include_directories(${PROJECT_SOURCE_DIR}/tcp/include)
include_directories(${PROJECT_SOURCE_DIR}/thread/include)# 给当前节点添加子目录
add_subdirectory(common)
add_subdirectory(http)
add_subdirectory(reactor)
add_subdirectory(tcp)
add_subdirectory(thread)link_libraries(common http reactor tcp thread -lpthread)
add_executable(server main.cpp)# 指定输出的路径
set(HOME ${PROJECT_SOURCE_DIR}) # 定义一个变量用于存储一个绝对路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin) # 将拼接好的路径值设置给 EXECUTABLE_OUTPUT_PATH 变量
- 执行命令和结果:
heheda@linux:~/Linux/LinuxServerCppInclude$ mkdir build
heheda@linux:~/Linux/LinuxServerCppInclude$ cd build/
heheda@linux:~/Linux/LinuxServerCppInclude/build$ cmake ..
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/heheda/Linux/LinuxServerCppInclude/build
heheda@linux:~/Linux/LinuxServerCppInclude/build$ make
Scanning dependencies of target thread
[ 5%] Building CXX object thread/CMakeFiles/thread.dir/src/ThreadPool.cpp.o
[ 10%] Building CXX object thread/CMakeFiles/thread.dir/src/WorkerThread.cpp.o
[ 15%] Linking CXX static library ../../staticLib/thread/libthread.a
[ 15%] Built target thread
Scanning dependencies of target common
[ 20%] Building CXX object common/CMakeFiles/common.dir/src/Buffer.cpp.o
[ 25%] Building CXX object common/CMakeFiles/common.dir/src/Channel.cpp.o
[ 30%] Linking CXX static library ../../staticLib/common/libcommon.a
[ 30%] Built target common
Scanning dependencies of target http
[ 35%] Building CXX object http/CMakeFiles/http.dir/src/HttpRequest.cpp.o
[ 40%] Building CXX object http/CMakeFiles/http.dir/src/HttpResponse.cpp.o
[ 45%] Linking CXX static library ../../staticLib/http/libhttp.a
[ 45%] Built target http
Scanning dependencies of target reactor
[ 50%] Building CXX object reactor/CMakeFiles/reactor.dir/src/Dispatcher.cpp.o
[ 55%] Building CXX object reactor/CMakeFiles/reactor.dir/src/EpollDispatcher.cpp.o
[ 60%] Building CXX object reactor/CMakeFiles/reactor.dir/src/EventLoop.cpp.o
[ 65%] Building CXX object reactor/CMakeFiles/reactor.dir/src/PollDispatcher.cpp.o
[ 70%] Building CXX object reactor/CMakeFiles/reactor.dir/src/SelectDispatcher.cpp.o
[ 75%] Linking CXX static library ../../staticLib/reactor/libreactor.a
[ 75%] Built target reactor
Scanning dependencies of target tcp
[ 80%] Building CXX object tcp/CMakeFiles/tcp.dir/src/TcpConnection.cpp.o
[ 85%] Building CXX object tcp/CMakeFiles/tcp.dir/src/TcpServer.cpp.o
[ 90%] Linking CXX static library ../../staticLib/tcp/libtcp.a
[ 90%] Built target tcp
Scanning dependencies of target server
[ 95%] Building CXX object CMakeFiles/server.dir/main.cpp.o
[100%] Linking CXX executable ../bin/server
[100%] Built target server
heheda@linux:~/Linux/LinuxServerCppInclude/build$ cd ../bin
heheda@linux:~/Linux/LinuxServerCppInclude/bin$ ./server
DEBUG: /home/heheda/Linux/LinuxServerCppInclude/tcp/src/TcpServer.cpp@run, line: 66
***LogInfo[服务器程序已经启动了...]

二、动态库
1.在common文件夹中的CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(common)# 搜索源文件
aux_source_directory(./src/ SRC)
set(LIBRARY_OUTPUT_PATH ${LIBPATH}) # 库生成的路径 LIBPATHadd_library(common SHARED ${SRC}) # 动态库
2.在http文件夹中的CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(http)# 搜索源文件
aux_source_directory(./src/ SRC)
set(LIBRARY_OUTPUT_PATH ${LIBPATH}) # 库生成的路径 LIBPATHadd_library(http SHARED ${SRC}) # 动态库
3.在reactor文件夹中的CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(reactor)
aux_source_directory(./src/ SRC)# 搜索源文件
set(LIBRARY_OUTPUT_PATH ${LIBPATH}) # 库生成的路径 LIBPATHadd_library(reactor SHARED ${SRC}) # 动态库
4.在tcp文件夹中的CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(tcp)link_libraries(common http reactor)
aux_source_directory(./src/ SRC)# 搜索源文件
set(LIBRARY_OUTPUT_PATH ${LIBPATH}) # 库生成的路径 LIBPATHadd_library(tcp SHARED ${SRC}) # 动态库
5.在thread文件夹中的CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(thread)
aux_source_directory(./src/ SRC)# 搜索源文件
set(LIBRARY_OUTPUT_PATH ${LIBPATH}) # 库生成的路径 LIBPATHadd_library(thread SHARED ${SRC}) # 动态库
6.在根目录中的CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(HttpWeb)# 库生成的路径
set(LIBPATH ${PROJECT_SOURCE_DIR}/sharedLib)include_directories(${PROJECT_SOURCE_DIR}/common/include)
include_directories(${PROJECT_SOURCE_DIR}/http/include)
include_directories(${PROJECT_SOURCE_DIR}/reactor/include)
include_directories(${PROJECT_SOURCE_DIR}/tcp/include)
include_directories(${PROJECT_SOURCE_DIR}/thread/include)# 给当前节点添加子目录
add_subdirectory(common)
add_subdirectory(http)
add_subdirectory(reactor)
add_subdirectory(tcp)
add_subdirectory(thread)# link_libraries(common http reactor tcp thread -lpthread)
add_executable(server main.cpp)
target_link_libraries(server common http reactor tcp thread -lpthread)# 指定输出的路径
set(HOME ${PROJECT_SOURCE_DIR}) # 定义一个变量用于存储一个绝对路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin) # 将拼接好的路径值设置给 EXECUTABLE_OUTPUT_PATH 变量

相关文章:
CMake TcpServer项目 生成静态库.a / 动态库.so
CMake 实战构建TcpServer项目 静态库/动态库-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/135608829?spm1001.2014.3001.5501 在这篇博客的基础上,我们把头文件放在include里边,把源文件放在src里边,重新构建 hehedali…...
为什么光刻要用黄光
光刻是集成电路(IC或芯片)制造中的重要工艺之一。简单来说,它是通过使用光掩膜和光刻胶在基板上复制电路图案的过程。 基板将涂覆硅二氧化层绝缘层和光刻胶。光刻胶在被紫外光照射后可以容易地用显影剂溶解,然后在腐蚀后…...
Python 两种多值参数
有时可能需要一个函数中处理的参数的个数是不确定的,就需要使用多值参数 参数名前加上*,代表可以接收元组参数名前加上**,代表可以接收字典 代码: def demo(*args, **kwargs):print(args)print(kwargs)demo(1, 2, 3, 4, 5, nam…...
【Python学习】Python学习19- 异常处理
目录 【Python学习】Python学习19- 异常处理 前言python标准异常异常处理带异常类型语法不带异常类型语法使用except而带多种异常类型try-finally 语句触发异常 参考 文章所属专区 Python学习 前言 本章节主要说明Python的异常处理。 python标准异常 BaseException 所有异常…...
《A++ 敏捷开发》- 4 三点估算
估算是一个范围,不是一个数 唐工:你估计完成开发用户登录模块要多少天?小李:3天。唐工:能在3天完成的可能性有多高?小李:可能性很高。唐工:可否量化一点?小李:可能性为5…...
cesiumlab切片通过arcgisjs加载
cesiumlab切片通过arcgisjs加载 需要注意2个地方,一个是tileInfo,一个是getTileUrl, 在tileInfo中定义好cesiumlab切片的相关信息。 getTileUrl 格式化url的格式。 注意设置编辑,避免超出范围报404。 <html lang"en"…...
React16源码: React中调度之scheduleWork的源码实现
scheduleWork 1 ) 概述 在 ReactDOM.render, setState, forceUpdate 这几个方法最终都调用了 scheduleWork 这个方法 在 scheduleWork 当中,它需要去找到更新对应的 FiberRoot 节点 在使用 ReactDOM.render 的时候,传给 scheduleWork 的就是…...
【STM32】| 02——常用外设 | I2C
系列文章目录 【STM32】| 01——常用外设 | USART 【STM32】| 02——常用外设 | I2C 失败了也挺可爱,成功了就超帅。 文章目录 前言1. 简介2. I2C协议2.1 I2C物理连接2.2 I2C通信协议2.2.1 起始和停止信号2.2.2 数据有效性2.2.3 数据传输格式2.2.4 从机地址/数据方…...
微服务架构设计核心理论:掌握微服务设计精髓
文章目录 一、微服务与服务治理1、概述2、Two Pizza原则和微服务团队3、主链路规划4、服务治理和微服务生命周期5、微服务架构的网络层搭建6、微服务架构的部署结构7、面试题 二、配置中心1、为什么要配置中心2、配置中心高可用思考 三、服务监控1、业务埋点的技术选型2、用户行…...
.net core 6 集成和使用 mongodb
1、安装包 MongoDB.Driver 2、定义顶层类 /// <summary> /// monggodb规范 /// </summary> public abstract class MongoDBToolBase { /// <summary> /// 客户端 /// </summary> protected MongoClient mongoClient { get; private …...
07-微服务getaway网关详解
一、初识网关 在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。这样的话会产生很多问题,例…...
MS2660:L1 频段卫星导航射频前端低噪声放大器芯片
MS2660 是一款具有高增益、低噪声系数的低噪声放 大器(LNA)芯片,支持 L1 频段多模式全球卫星定位,可 以应用于 GPS、北斗二代、伽利略、Glonass 等 GNSS 导航 接收机中。芯片采用先进工艺制造,封装采用 2 mm 2 mm …...
微信小程序防止截屏录屏
一、使用css添加水印 使用微信小程序原生的view和css给屏幕添加水印这样可以防止用户将小程序内的隐私数据进行截图或者录屏分享导致信息泄露,给小程序添加一个水印浮层。这样即使被截图或者拍照,也能轻松地确定泄露的源头。效果图如下: 代码…...
126.(leaflet篇)leaflet松散型arcgis缓存切片加载
地图之家总目录(订阅之前必须详细了解该博客) arcgis缓存切片数据格式如下: 完整代码工程包下载,运行如有问题,可“私信”博主。效果如下所示: leaflet松散型arcgis缓存切片加载 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYP...
物联网介绍
阅读引言: 本文从多方面叙述物联网的定义以及在物联网当中的各种通信的介绍。 一、物联网的定义 1.1 通用的定义 物联网(Internet of Things,IOT;也称为Web of Things)是指通过各种信息传感设 备,如传感器、…...
Flume 之自定义Sink
1、简介 前文我们介绍了 Flume 如何自定义 Source, 并进行案例演示,本文将接着前文,自定义Sink,在这篇文章中,将使用自定义 Source 和 自定义的 Sink 实现数据传输,让大家快速掌握Flume这门技术。 2、自定…...
【1】SM4 CBC-MAC 机制
0x01 题目 MSG1: e55e3e24a3ae7797808fdca05a16ac15eb5fa2e6185c23a814a35ba32b4637c2 MAC1: 0712c867aa6ec7c1bb2b66312367b2c8 ----------------------------------------------------- MSG2: d8d94f33797e1f41cab9217793b2d0f02b93d46c2ead104dce4bfec453767719 MAC2: 4366…...
响应式编程Reactor API大全(下)
Reactor 是一个基于响应式编程的库,主要用于构建异步和事件驱动的应用程序。Reactor 提供了丰富的 API,包括创建、转换、过滤、组合等操作符,用于处理异步数据流。以下是一些 Reactor 的主要 API 示例: pom依赖 <dependencyMan…...
【STM32】HAL库的STOP低功耗模式UART串口唤醒,解决首字节出错的问题(全网第一解决方案)
【STM32】HAL库的STOP低功耗模式UART串口唤醒,解决首字节出错的问题(全网第一解决方案) 前文: 【STM32】HAL库的STOP低功耗模式UART串口唤醒,第一个接收字节出错的问题(疑难杂症) 目前已解决 …...
Python 语法糖
一、基本概念 语法糖,可以理解为:“甜蜜” 的便捷语法。 它是编程语言为程序提供的更简洁、更易读的语法实现的语法结构,它并不影响语言的功能,仅仅是一种更便捷的书写方式。 这就像你制作蛋糕时,使用现代烤箱而不是…...
百度大模型二面:有微调过 Agent 能力吗?数据集如何收集?
1. 问题分析做 Agent 的团队很多,但真正动手微调过 Agent 能力的人并不多。大部分人停留在 Prompt 闭源 API 的阶段就基本上交差了,只有当你真的需要在开源模型上把 Agent 跑起来、或者对工具调用的稳定性有极致要求时,才会走到微调这一步。…...
如何快速掌握NoteGen AI笔记:新手入门完整指南
如何快速掌握NoteGen AI笔记:新手入门完整指南 【免费下载链接】note-gen 一款专注于记录和写作的跨端 AI 笔记应用。 项目地址: https://gitcode.com/GitHub_Trending/no/note-gen 在信息爆炸的时代,高效记录和管理知识已成为现代人的刚需。Note…...
2026指纹浏览器与Web端设备识别技术的对抗与协同:从风控博弈到合规共生
在 2026 年的 Web 生态中,指纹浏览器与 Web 端设备识别技术始终处于 “对抗与协同” 的动态平衡中 —— 平台通过设备识别技术构建风控体系,防范恶意注册、批量操作、账号盗用等违规行为;指纹浏览器通过技术手段重构设备特征,实现…...
SmolVLA模型服务监控与告警体系搭建
SmolVLA模型服务监控与告警体系搭建 你刚把SmolVLA模型部署上线,看着它流畅地处理着第一批请求,心里总算踏实了点。但没过多久,问题就来了:半夜突然收到用户反馈说服务变慢了,你赶紧爬起来查,发现是GPU显存…...
3步告别卡顿:用鸣潮工具箱实现流畅游戏体验
3步告别卡顿:用鸣潮工具箱实现流畅游戏体验 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 你的游戏还在卡顿吗?试试这个免费解决方案 你是否曾经在《鸣潮》的激烈战斗中遭遇突然的…...
破解微信小程序video组件的限制:3种禁止拖动进度条的实战方案对比
微信小程序视频播放控制深度解析:3种禁止拖动进度条的工程化方案 在知识付费和在线教育类小程序中,视频内容的完整播放率直接影响知识传递效果。但微信小程序原生video组件的enable-progress-gesture属性仅能禁用触摸手势,无法真正阻止进度条…...
WhisperX语音识别:如何实现70倍实时转录精度与词级时间戳?
WhisperX语音识别:如何实现70倍实时转录精度与词级时间戳? 【免费下载链接】whisperX m-bain/whisperX: 是一个用于实现语音识别和语音合成的 JavaScript 库。适合在需要进行语音识别和语音合成的网页中使用。特点是提供了一种简单、易用的 APIÿ…...
Simulink模型加密二选一:是选‘受保护模型’还是自己写S-Function?一份给嵌入式代码生成者的选择指南
Simulink模型加密实战:受保护模型与S-Function的深度技术选型 在嵌入式系统开发中,Simulink模型往往承载着核心算法和知识产权。当需要与团队协作或交付给客户时,如何在保证模型可用性的同时防止核心逻辑被窥探或篡改?这成为每个嵌…...
在Ubuntu 22.04上为RK3588编译带RKmpp和RGA的FFmpeg(保姆级避坑指南)
在Ubuntu 22.04上为RK3588编译带RKmpp和RGA的FFmpeg(保姆级避坑指南) RK3588作为Rockchip新一代旗舰SoC,其强大的多媒体处理能力吸引了众多开发者。本文将手把手带你完成FFmpeg的完整编译流程,重点解决环境配置、依赖管理、运行时…...
别再手动算了!用Matlab RF Toolbox一键搞定S/Z/Y/ABCD参数转换(附3dB电桥实例代码)
射频工程师的救星:Matlab RF Toolbox参数转换全攻略 每次面对S/Z/Y/ABCD参数的手动转换,是不是总有种想摔计算器的冲动?那些复杂的矩阵运算和容易出错的推导过程,简直是在浪费生命。作为一名射频工程师,我深知这种痛苦…...
