C++/CMake 构建系统:(二)包管理

共享公共包 用过 npm、pip 或是 go 等的包管理系统就知道,对于工程来说,除了工程目录下的依赖包,还可以有一些系统范围共享的依赖包,以便减少重复包所占用的空间。 CMake 也提供了这个功能,允许设置全局范围的默认包搜索路径。 在系统范围内设置 CMAKE_PREFIX_PATH 环境变量可以指定包管理的前缀路径。而 CMAKE_INSTALL_PREFIX 环境变量可以指定安装和搜索包的前缀路径,所以这里优先使用后者方便同时设置安装和搜索包路径。 安装一个包到公共目录 对于可执行文件,可以简单的统一安装到公共目录的 bin 文件夹下。 install(TARGETS base_test DESTINATION bin)对于库文件,这里希望可以按工程区分不同的包,方便管理。 install(TARGETS libbase ARCHIVE DESTINATION "${PROJECT_NAME}/lib")install(FILES ${public_headers} DESTINATION "${PROJECT_NAME}/include/libbase")区分接口文件包含路径 如果需要安装的库包含接口目录,则有可能因为安装路径变化,导致头文件搜索错误。 这里需要区分构建和安装时的接口文件路径。 target_include_directories(libbase INTERFACE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}> $<INSTALL_INTERFACE:${PROJECT_NAME}/include>)安装时导出目标 为了方便其他工程引用安装到公共目录的包,可以使用 install 命令增加导出。 install(FILES ${public_headers} EXPORT "${PROJECT_NAME}Targets" DESTINATION "${PROJECT_NAME}/include/libbase")对于导出的包,需要增加一个 cmake 文件方便其他工程使用。 安装时导出配置 为了方便 find_package 命令导入包,还需要生成 Config 文件。CMake 提供了脚本来自动生成导出的 Config。 include(CMakePackageConfigHelpers)configure_package_config_file( "${PROJECT_SOURCE_DIR}/cmake/${PROJECT_NAME}Config.cmake.in" "${PROJECT_BINARY_DIR}/cmake/${PROJECT_NAME}Config.cmake" INSTALL_DESTINATION "${PROJECT_NAME}/cmake")write_basic_package_version_file( "${PROJECT_BINARY_DIR}/cmake/${PROJECT_NAME}ConfigVersion.cmake" VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}" COMPATIBILITY AnyNewerVersion)同时要提供配置文件模板 LibBaseConfig.cmake.in。 @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")check_required_components(@PROJECT_NAME@)最后把生成好的文件也安装到全局目录下。 install(DIRECTORY "${PROJECT_BINARY_DIR}/cmake" DESTINATION ${PROJECT_NAME})使用包 安装好的包,其他工程就可以通过 find_package 命令直接使用了。...

December 24, 2022 · 1 min · lyincc

C++/CMake 构建系统:(一)基本工程结构

主工程文件 首先要创建工程的主要入口,也就是一个 CMakeLists.txt 文件。 构建工程时就需要指定这个文件的所在目录。 CMake 版本和策略 主工程文件首先要描述的就是对 CMake 的版本选择和全局策略开关。 主要涉及 cmake_minimum_required 和 cmake_policy 两个命令。 对整个工程使用的 CMake 特性进行约定。 cmake_minimum_required(VERSION 3.24)全局变量 这部分定义工程需要的全局变量,如工程名、版本号等。 可以直接用 project 命令定义,也可以用 set 命令对变量进行指定。 project("base" VERSION 0.0.1)将全局变量同步到 C++ 代码 如果有些全局变量希望可以共享给 C++ 代码,比如工程版本号,可以使用 configure_file 修改部分文件的代码,将全局变量赋给文件中的指定占位符。 创建一个 project_config.h.in 文件,写入以下内容。 constexpr int kBaseVersionMajor = @Base_VERSION_MAJOR@; constexpr int kBaseVersionMinor = @Base_VERSION_MINOR@; constexpr char kBaseVersion = @Base_VERSION@; 在 CMakeLists.txt 中增加生成文件的命令。 configure_file(global_config.h.in global_config.h)构建后就会自动生成解析后的 global_config.h 文件供其他 C++ 源码使用。 全局编译选项 修改全局编译器配置,也可以使用默认配置不做修改。 这里指定默认的 C++ 语言标准版本。 set(CMAKE_CXX_STANDARD 20)set(CMAKE_CXX_STANDARD_REQUIRED True)添加自定义命令 如果有些构建的准备工作需要处理,比如将配置阶段生成的 project_config....

December 18, 2022 · 1 min · lyincc

HTTP 缓存控制学习

缓存 在 HTTP/1.1 协议 http://www.w3.org/Protocols/rfc2616/rfc2616.html 里, HTTP 的缓存处理步骤。 步骤一,第一次请求文件时。 服务器响应头中将给出该文件的缓存相关属性 Cache-Control 缓存控制开关 Expires 缓存超时时间(HTTP/1.0 遗留,被 Cache-Control 代替) Pragma 是否禁用(HTTP/1.0 遗留,被 Cache-Control 代替) Last-Modified 文件最后修改时间 ETag 文件标识 步骤二,第二次请求文件时,浏览器根据当前缓存的属性做出下一步的判断。 首先通过 Pragma 和 Cache-Control 判断本地缓存开关,优先级 Pragma > Cache-Control。如果判断缓存禁用,则直接向服务器请求文件,并要求服务器禁止缓存。 如果缓存开启,则通过 Expires 和 Cache-Control 判断缓存时间是否超时,优先级顺序是 Cache-Control > Expires。如果判断缓存可用,则直接使用本地缓存,不进行任何请求。 如果判断缓存超时,则向服务器发起请求,进入步骤三。 步骤三,浏览器判断缓存超时了,这时浏览器请求需要附加上当前缓存的相关属性,由服务器进行判断是否缓存。 如果当前缓存存在 Last-Modified 属性,则浏览器提交 If-Modified-Since 头,要求服务器判断文件修改时间是否更新。 如果当前缓存存在 ETag 属性,则浏览器提交 If-None-Match 头,让服务器判断文件 Hash 值是否匹配。...

December 3, 2022 · 1 min · lyincc

网络诊断

这里介绍一些常用的网络诊断、链路质量评估工具。 PING ping 是最常用的基于 ICMP Echo 协议的链路诊断工具,Windows 和 Linux 平台都有该工具。 ping 8.8.8.8 路由跟踪 路由跟踪是基于 IP 协议 TTL 限制触发 ICMP 错误实现的一种链路路径探测器。可以找出 IP 数据包和模板间经过的路由器地址。 Windows 的路由跟踪指令是 tracert。 tracert 8.8.8.8 Linux 上是 traceroute tarceroute 8.8.8.8 带宽测试 可以用于 TCP、UDP 协议带宽测试的工具有 iperf3 https://iperf.fr/。 iperf3 需要客户端和服务端同时运行。 服务端 iperf3 -s 客户端 iperf3 -c x.x.x.x 同类工具还有 dperf https://github.com/baidu/dperf netperf https://github.com/HewlettPackard/netperf qperf https://github.com/linux-rdma/qperf。 psping 微软的工具包 PSTools 中提供了 psping 工具用于测试 TCP 协议延迟。 psping www.google.com:443 也可以测试 UCP 协议 psping -u 8....

September 16, 2022 · 1 min · lyincc

Fabric 运维脚本

安装 直接用 pip 安装就好。 pip install fabric 主要类功能 Connection 类用于建立 ssh 连接。 SerialGroup 用于串行多连接操作,ThreadingGroup 用于并行多连接操作。 使用 fab 命令 fab 命令默认执行 fabric.py 脚本文件。 @task 装饰器可以给 fab 命令添加任务。 列出当前脚本中的任务 fab --list fab -l 指定服务器上执行 @task 任务 fab -H aliyun_sh command

September 16, 2022 · 1 min · lyincc