
AI 技能AI 插件人工智能【免费下载链接】agentic-awesome-skillsAAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,600 agentic skills. Includes CLI, local MCP, catalog, plugins, and Workbench.项目地址https://gitcode.com/GitHub_Trending/an/agentic-awesome-skills点击查看免费下载本文以agentic-awesome-skills仓库中 boost-asio-pro 技能源自社区alexprivalov/boost-asio-skill以 MIT 许可收录的构建参考文档为主体系统讲解如何为 C20 异步网络程序编写正确的 CMake 构建脚本从 Boost.Asio 的 header-only 集成、Standalone Asio 的手工头文件路径到一套同时支持两者的双模式 CMake再到BOOST_ERROR_CODE_HEADER_ONLY、-fcoroutines等关键宏与编译选项的真实作用。读完本文你将能针对任意 Boost/Asio 版本组合写出可复制、可编译、不会踩中缺-fcoroutines编译失败宏重复定义等经典坑的构建配置。一、构建方式由版本决定先确认工具链再选配置Asio 的 API 经历过三次形态变化经典io_service→io_context→ C20 协程构建方式也随之不同。技能文档 SKILL.md 强调写代码之前必须先确认目标机器上真实的 Boost或 Asio版本与 C 标准而不是假设最新版。判定方法包括find_package(Boost)的输出、dpkg -l libboost-dev、brew info boost、CMAKE_CXX_STANDARD或直接询问用户。Boost 版本C 标准适用的异步风格对应参考≥ 1.77C20协程co_awaitawaitableT首选coroutines.md≥ 1.74C11–17完成处理器回调最可移植的基线pre-cpp20.md≥ 1.80C11–17栈式asio::spawnyield_context需链接 Boost.Coroutine非 header-onlypre-cpp20.md1.62–1.65C11经典io_service/strand.wrap/expires_from_nowclassic-boost.md无论哪种风格SSL/TLS 配置可参考 ssl.md而所有风格的 CMake 构建配置都统一参考本文所讲解的 build.md。二、Boost.Asio从 Boost 1.74 起默认 header-only自 Boost 1.74 起Asio 默认以 header-only 方式分发——库的源码全部内联在头文件中无需为 Asio 本体链接任何 .so/.a。唯一会把外部符号拉进链接的是boost::system::error_code的 out-of-line 符号这一点在第三节详述。一个最小但完整的 CMake 配置如下来自 build.mdfind_package(Boost REQUIRED) find_package(OpenSSL REQUIRED) # 仅在需要使用 SSL 时 find_package(Threads REQUIRED) target_link_libraries(myapp PRIVATE Boost::headers # header-only Asio OpenSSL::SSL OpenSSL::Crypto # 仅在需要使用 SSL 时 Threads::Threads ) target_compile_features(myapp PRIVATE cxx_std_20) # GCC 协程支持所必需——缺少此行会导致编译失败 target_compile_options(myapp PRIVATE $$CXX_COMPILER_ID:GNU:-fcoroutines ) # 可选真正做到纯 header-only无需链接 Boost.System target_compile_definitions(myapp PRIVATE BOOST_ERROR_CODE_HEADER_ONLY)各部分的含义与注意点Boost::headers只导入 Boost 的头文件目录不链接任何 Boost 库。这是 header-only Asio 的推荐用法比链接Boost::system组件更轻。只有当目标环境是经典时代Boost 1.66时才必须显式链接Boost::system详见第六节。OpenSSL::SSL OpenSSL::Crypto仅在代码使用ssl::stream时引入若只写纯 TCP/UDP 程序可以删掉对应find_package与链接行。注意ssl::stream属于库特性而非语言特性无论协程、回调还是栈式协程风格都需要 OpenSSL。Threads::ThreadsAsio 的多线程执行模型io_context::run()被多线程调用依赖系统线程std::thread在多数平台也隐式需要-pthread显式声明最稳妥。cxx_std_20C20 协程风格co_awaitawaitableT的硬性要求。技能文档同时提醒chrono 字面量如250ms/30s属于 C14 特性若目标是真正的 C11 构建应改写为std::chrono::milliseconds(250)。-fcoroutines仅 GCC这是 GCC 编译 C20 协程必须的开关缺失会导致build will fail级别的编译错误。$$CXX_COMPILER_ID:GNU:...是 CMake 生成器表达式确保该选项只在编译器为 GNU 系时生效避免影响 MSVC 等其他工具链。三、Header-Only 的真相BOOST_ERROR_CODE_HEADER_ONLY才是关键技能文档在 build.md 中明确解释了 header-only 的边界Asio 本身是 header-only。唯一会把 Boost 库拉进链接的是boost::system::error_code的 out-of-line 符号因此要做到真正无需链接任何 Boost 库请定义BOOST_ERROR_CODE_HEADER_ONLY。也就是说不定义该宏时boost::system::error_code的实现仍可能引用libboost_system中的符号部分工具链在 1.74 之后其实已不再需要但跨发行版保险起见仍建议定义。而BOOST_ASIO_HEADER_ONLY则很少需要——它只在过去曾启用过 Asio 分离编译separate compilation时才相关正常情况下两个宏不需要同时定义。技能文档特别强调了一个极易踩的坑BOOST_ERROR_CODE_HEADER_ONLY必须且只能在恰好一个地方定义首选位置是 CMake 的target_compile_definitions。如果同时在 CMake 里定义、又在某个源文件里写#define BOOST_ERROR_CODE_HEADER_ONLY会触发-Wmacro-redefined警告宏重复定义。因此源文件里只需正常#include不要写任何#define#include boost/asio.hpp #include boost/asio/ssl.hpp #include boost/asio/experimental/awaitable_operators.hpp这三个头文件的用途boost/asio.hpp提供核心io_context、tcp::socket、steady_timer等boost/asio/ssl.hpp提供ssl::streamboost/asio/experimental/awaitable_operators.hpp提供协程并行操作符||与注意该头文件有版本下限见第五节。四、Standalone Asio永远 header-only但没有官方 CMake 包Standalone Asiothink-async.com 维护的独立版与 Boost.Asio 出自同一作者、API 几乎一致仅命名空间与头文件前缀不同asio/asio.hpp对比boost::asio/boost/asio.hpp并且从设计上就始终是 header-only。它没有随附 CMake config 包需要借助pkg-config或手工指定头文件路径build.md# Standalone Asio 没有 CMake config——使用 pkg-config 或手工路径 find_package(OpenSSL REQUIRED) find_package(Threads REQUIRED) # 若通过 Homebrew 安装 find_path(ASIO_INCLUDE_DIR asio.hpp HINTS /opt/homebrew/include) target_include_directories(myapp PRIVATE ${ASIO_INCLUDE_DIR}) target_link_libraries(myapp PRIVATE OpenSSL::SSL OpenSSL::Crypto Threads::Threads) target_compile_features(myapp PRIVATE cxx_std_20) target_compile_definitions(myapp PRIVATE ASIO_STANDALONE) target_compile_options(myapp PRIVATE $$CXX_COMPILER_ID:GNU:-fcoroutines )要点find_path(ASIO_INCLUDE_DIR asio.hpp HINTS /opt/homebrew/include)HINTS指向 Apple Silicon 上 Homebrew 的默认安装前缀在 Linux 上可改为/usr/include此时通常已含 asio或通过-DASIO_INCLUDE_DIR...在命令行覆盖。ASIO_STANDALONE编译期宏让 standalone 头文件使用asio::error_code内部对应std::error_code而非boost::system::error_code。宏前缀对比Boost.Asio 是BOOST_ASIO_Standalone 是ASIO_。对应的源文件包含方式#include asio.hpp #include asio/ssl.hpp #include asio/experimental/awaitable_operators.hpp // 无需任何宏——Standalone Asio 始终 header-only一个值得注意的例外即使是 Standalone Asio其栈式协程spawn仍依赖 Boost.Coroutine/Boost.Context会把 Boost 拖回一个原本无需 Boost 的工程pre-cpp20.md 明确注明。若想保持零 Boost 依赖请使用回调风格而非栈式协程。五、双模式 CMake一套脚本同时支持两种 Asio实际工程中经常需要在用户机器上是 Boost.Asio与用户机器上是 Standalone Asio之间切换。build.md 给出了一个标准的双模式方案——用option控制并配套命名空间 shim 实现源码级透明切换option(USE_STANDALONE_ASIO Use standalone Asio instead of Boost.Asio OFF) find_package(OpenSSL REQUIRED) find_package(Threads REQUIRED) if(USE_STANDALONE_ASIO) find_path(ASIO_INCLUDE_DIR asio.hpp HINTS /opt/homebrew/include) target_include_directories(myapp PRIVATE ${ASIO_INCLUDE_DIR}) target_compile_definitions(myapp PRIVATE USE_STANDALONE_ASIO ASIO_STANDALONE) else() find_package(Boost REQUIRED) target_link_libraries(myapp PRIVATE Boost::headers) target_compile_definitions(myapp PRIVATE BOOST_ERROR_CODE_HEADER_ONLY) endif() target_link_libraries(myapp PRIVATE OpenSSL::SSL OpenSSL::Crypto Threads::Threads) target_compile_features(myapp PRIVATE cxx_std_20) target_compile_options(myapp PRIVATE $$CXX_COMPILER_ID:GNU:-fcoroutines)使用方式默认USE_STANDALONE_ASIOOFF走 Boost 分支需要切换时执行cmake -DUSE_STANDALONE_ASIOON ..。源码侧配套的 shim来自 SKILL.md此后业务代码统一用net::前缀#ifdef USE_STANDALONE_ASIO #include asio.hpp namespace net asio; using error_code asio::error_code; #else #include boost/asio.hpp namespace net boost::asio; using error_code boost::system::error_code; #endif namespace ssl net::ssl; using tcp net::ip::tcp;六、按风格差异选择构建参数从 C11 回调到经典 io_service构建配置并非只有 C20 协程一种形态。技能文档针对不同历史时期提供了对应参数回调风格C11/14/17回调风格是 C11 时代最可移植的基线。它不需要-fcoroutines该选项只服务于 C20 的co_await其余与协程风格一致pre-cpp20.mdset(CMAKE_CXX_STANDARD 11) # 或 14 / 17 set(CMAKE_CXX_EXTENSIONS OFF) # 否则 CMake 会输出 -stdgnuNN 而非字面 -stdcNN target_link_libraries(app PRIVATE Boost::headers Threads::Threads) target_compile_definitions(app PRIVATE BOOST_ERROR_CODE_HEADER_ONLY)其中CMAKE_CXX_EXTENSIONS OFF是一个容易被忽略的细节它确保编译标志为严格的-stdcNN而非 GNU 扩展模式。栈式协程asio::spawn yield_context栈式协程虽然写法接近co_await底层却是 Boost.Coroutine依赖 Boost.Context必须链接而非 header-onlyfind_package(Boost REQUIRED COMPONENTS coroutine) target_link_libraries(app PRIVATE Boost::coroutine) # 会连带引入 Boost.Context同时注意三参数形式spawn(ex, fn, token)需要Boost ≥ 1.80旧版本只有spawn(ex, fn)。在 Debian bookwormBoost 1.74这类发行版上回调风格可以干净地编译而栈式spawn不行——这是技能作者通过实际编译验证过的结论。经典 io_service 时代Boost 1.66对 Boost 1.62–1.65如 Debian 9必须回退到经典 API且要显式链接 Boost.Systemclassic-boost.md现代1.66经典pre-1.66io_contextio_servicemake_strand(ex)/strandany_io_executorio_service::strand strand(io)bind_executor(strand, h)strand.wrap(h)timer.expires_after(d)timer.expires_from_now(d)移动返回async_accept()async_accept(socket_, handler)header-onlyerror_code链接Boost.Systemfind_package(Boost COMPONENTS system)技能文档还给出了该时代的具体工程约束cmake_minimum_required(VERSION 3.5)Debian 9 自带 cmake 3.7并且由于-S/-B需要 cmake ≥ 3.13应采用经典的外部构建流程mkdir build cd build cmake ..。在代码层面通过#if BOOST_VERSION 106600把io_service/io_context与expires_after/expires_from_now隔离成 shim即可让同一份代码在 1.62 到 1.90 全区间编译。七、版本地板与发行版差异编译期就会爆的坑构建配置的正确性高度依赖版本。技能文档 SKILL.md 给出了一张版本地板表作者标注为通过实际编译验证而非查阅文档直接决定你能用哪些头文件与 API特性最低版本experimental/awaitable_operators.hpp\|\|/操作符Boost ≥ 1.77 / Asio ≥ 1.20as_tuple完成令牌Boost ≥ 1.79 / Asio ≥ 1.21co_composed自定义组合操作Boost ≥ 1.85 / Asio ≥ 1.30三参数asio::spawn(ex, fn, token)Boost ≥ 1.80any_io_executorstrandany_io_executor、tcp::socket默认执行器Boost ≥ 1.74回调风格的下限更低版本需使用旧式io_context::strandio_context、make_strand、expires_afterBoost ≥ 1.66更低版本回退经典io_service常见的发行版陷阱Debian bookworm 自带 Boost 1.74没有awaitable_operators.hpp#include直接失败Ubuntu 20.04 自带 1.71没有any_io_executorDebian 9 自带 1.62。这也是为什么双模式 CMake 中find_package(Boost REQUIRED)后应打印版本号并把版本地板检查放进CMakeLists.txt的message()或if(Boost_VERSION VERSION_LESS ...)保护中。八、常见构建错误速查技能文档 SKILL.md 的错误排查表中有多类与构建直接相关的问题这里汇总为清单症状原因与修复GCC 编译协程代码失败缺少-fcoroutines——加入target_compile_options的生成器表达式报未定义的 Boost.System 符号未定义BOOST_ERROR_CODE_HEADER_ONLY现代 Boost或经典 Boost 未链接Boost::system-Wmacro-redefined警告BOOST_ERROR_CODE_HEADER_ONLY被重复定义——只在 CMake 的target_compile_definitions定义一次#include experimental/awaitable_operators.hpp找不到头文件Boost 1.77 / Asio 1.20版本地板不满足链接失败找不到Boost::coroutine栈式spawn需要find_package(Boost REQUIRED COMPONENTS coroutine)async_accept(make_strand(...))返回值类型不匹配接受的 socket 是basic_stream_sockettcp, strand...而非tcp::socket用auto或按值接收chrono 字面量在 C11 下报错250ms是 C14 特性改写为std::chrono::milliseconds(250)九、写在最后一份可落地的构建检查单综合 build.md 与 SKILL.md 的收尾清单一个合格的 Asio 工程 CMake 至少应满足find_package(Boost)或手工find_path定位 standalone Asio后确认版本风格选择与版本地板匹配标准设为cxx_std_20协程风格或cxx_std_11/14/17回调风格且CMAKE_CXX_EXTENSIONS OFFGCC 且使用 C20 协程时-fcoroutines已通过$$CXX_COMPILER_ID:GNU:...加入BOOST_ERROR_CODE_HEADER_ONLY仅在 CMake 中定义一次源文件不重复#define仅在使用栈式spawn时链接Boost::coroutine否则保持Boost::headers header-only经典 Boost 1.66才链接Boost::system并启用经典 API shimSSL 程序已引入OpenSSL::SSL OpenSSL::Crypto且所有ssl::stream操作受 strand 保护见 ssl.md最终执行一次真实编译验证——技能文档反复强调版本地板只有在你实际构建通过之后才算真实成立。这套配置体系覆盖了从 Debian 9 的 Boost 1.62 到现代 Boost 1.90、以及零 Boost 依赖的 Standalone Asio 的全部场景是编写跨发行版异步网络程序时值得直接复用的构建底座。赞分享AI 技能AI 插件人工智能【免费下载链接】agentic-awesome-skillsAAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,600 agentic skills. Includes CLI, local MCP, catalog, plugins, and Workbench.项目地址https://gitcode.com/GitHub_Trending/an/agentic-awesome-skills点击查看免费下载相关推荐Upscayl Mac 使用教程AI 图像放大免费把模糊照片变清晰的完整路径Upscayl Mac 使用教程AI 图像放大免费把模糊照片变清晰的完整路径 手机拍的照片发给客户被吐槽分辨率太低。想放大又不想为付费工具花钱。 Upsc人工智能AI 应用图像处理桌面应用CMake 集成 GLEW 完整指南FindGLEW 模块的原理、配置与实战CMake 集成 GLEW 完整指南FindGLEW 模块的原理、配置与实战 导读 GLEWOpenGL Extension Wrangler Librar构建工具开发工具CLICXX 多语言构建系统集成指南Cargo、Bazel/Buck2、CMake 与自定义构建全配置方案CXX 多语言构建系统集成指南Cargo、Bazel/Buck2、CMake 与自定义构建全配置方案 本篇技术指南以 CXXRust ♡ C 安全互操作开发工具上一篇HackRF多核任务通信共享内存与消息传递下一篇Hy3-oQ2e-2.33bpw性能实测MathQA 0.62分背后的8位专家层与4位注意力机制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考