c-ares 1.34.6 编译安装完全指南:从 AutoTools 到 CMake 的多平台构建实践 c-ares 1.34.6 编译安装完全指南从 AutoTools 到 CMake 的多平台构建实践【免费下载链接】fluent-bitFast and Lightweight Logs, Metrics and Traces processor for Linux, BSD, OSX and Windows项目地址: https://gitcode.com/GitHub_Trending/fl/fluent-bit本指南以 c-ares 1.34.6本仓库内置的异步 DNS 解析库位于 lib/c-ares-1.34.6其官方安装文档为 INSTALL.md为主体系统讲解如何从源码编译、构建并安装该库覆盖 AutoTools、CMake、交叉编译与 Windows/DOS 等特殊平台流程并结合本仓库中 Fluent Bit 的 c-ares 集成代码 展示真实应用场景。读完本文你将掌握 c-ares 在主流平台上的完整构建方法、关键编译选项的取舍以及它作为第三方库被上游项目如 Fluent Bit链式构建时的标准姿势。一、c-ares 是什么以及为什么要自己编译c-ares 是一个用 C 语言编写的异步 DNS 解析库其名字取自 asynchronous resolver。与阻塞式getaddrinfo()不同c-ares 通过非阻塞方式发起 DNS 查询适合需要高并发、不能被 DNS 超时拖垮的网络程序。需要先说明的是本指南面向的是从源码编译的场景。很多人直接下载 c-ares 的二进制发行包使用但二进制包无法自定义编译选项也不便于交叉编译到特定平台只有从源码构建才能控制静态/动态库形态、线程安全、符号隐藏等细节。本文档不介绍二进制包的安装方式只讲解源码编译。在本仓库中c-ares 正是以源码形式内嵌于lib/目录lib/c-ares-1.34.6由 Fluent Bit 通过 CMake 的add_subdirectory链式构建这是从源码编译而非装二进制包的典型范例后文将专门分析。二、从 Git 仓库构建与官方 tarball 的差异如果你是从 Git 仓库而非官方 release tarball获取的代码构建流程略有差异。INSTALL.md 明确要求参阅仓库根目录的GIT-INFO文件获取具体指引注意当前仓库的 lib/c-ares-1.34.6 目录中未包含该文件它通常随 Git 源码树发布。核心差异在于构建文件的生成方式不使用 CMake 时在 Unix 上需要先运行./buildconf在 Windows 上运行buildconf.bat用于从configure.ac、Makefile.am等 Autotools 源文件生成configure脚本和 Makefile。前者要求本机安装有Autotoolsautoconf/automake/libtool 工具链。使用 CMake 时Git 检出与官方 tarball 的构建步骤完全一致无需额外生成步骤。当前仓库已包含构建所需的全部生成产物configure、configure.ac、buildconf、buildconf.bat 均存在因此可以直接进入下一节的常规构建。三、AutoTools 构建Unix 平台的标准流程3.1 三步走适用于大多数 UnixLinux、FreeBSD 等解压源码后标准安装只需三到四条命令./configure make make install最后一条make install通常需要 root 权限。如果你是 Git 检出源码请先按上一节处理 buildconf。查看 configure 支持的全部选项./configure --help如果不想装到默认的/usr/local必须在运行 configure 时就指定前缀./configure --prefix/path/to/c-ares/tree如果对该目录有写权限则make install无需 root。例如安装到自己的家目录./configure --prefix$HOME make make install3.2 更多常用选项强制使用 cc 而非 gcc当两者同时存在时CCcc ./configure # 或 env CCcc ./configure只编译静态库禁用共享库./configure --disable-shared与之对称的还有--disable-static只编共享库。在 AutoTools 体系下二者只能二选一或都禁用而 CMake 可同时产出两种形态见第四节。开发者调试选项如果你本身就是 c-ares 开发者且使用 gcc可开启./configure --enable-debug这会启用更多调试信息便于配合 gdb 定位问题。3.3 特殊环境的配置技巧uClibc某些版本的 uClibc 需要配置CPPFLAGS-D_GNU_SOURCE1才能获得正确的 large file support大文件支持。Linux 上的 Open Watcom C 编译器需要显式指定工具链变量./configure CCowcc AR$WATCOM/binl/wlib AR_FLAGS-q \ RANLIB/bin/true STRIP$WATCOM/binl/wstrip CFLAGS-Wextra四、交叉编译为嵌入式与目标平台构建c-ares 的交叉编译核心是在 configure 时指定--host与--build参数并通过环境变量把工具链指给构建系统。--host目标运行平台如powerpc-hardhat-linux--build当前编译主机平台如i586-pc-linux-gnu。以下脚本示例演示了使用 MonteVista Hardhat Linux 工具链为 IBM 405GP PowerPC 处理器交叉编译#! /bin/sh export PATH$PATH:/opt/hardhat/devkit/ppc/405/bin export CPPFLAGS-I/opt/hardhat/devkit/ppc/405/target/usr/include export ARppc_405-ar export ASppc_405-as export LDppc_405-ld export RANLIBppc_405-ranlib export CCppc_405-gcc export NMppc_405-nm ./configure --targetpowerpc-hardhat-linux \ --hostpowerpc-hardhat-linux \ --buildi586-pc-linux-gnu \ --prefix/opt/hardhat/devkit/ppc/405/target/usr/local \ --exec-prefix/usr/local两个关键补充随机数设备configure 可能无法探测目标系统的随机数生成设备此时需要显式传入--with-random/dev/urandom。这一点与源码中的默认值吻合——CMakeLists.txt 中CARES_RANDOM_FILE默认即为/dev/urandom。安装位置--prefix决定 c-ares 安装到目标系统的哪个目录。configure 成功后照常执行make和make install。很多场景下命令可以大幅简化最简形式为./configure --hostARCH-OS4.1 CygwinWindows与 Unix 安装几乎一致只需在 c-ares 根目录用sh configure运行 configure 脚本。注意/bin/下必须有sh可执行文件否则 configure 会在接近尾声时失败。之后运行make即可。4.2 QNX小心FD_SETSIZE引发的段错误QNX 面向资源受限环境其头文件默认将FD_SETSIZE限制为 32。而 c-ares 返回的 socket 描述符可能超过该值一旦传入select(..)的fd_set宏就会导致内存错误 / SIGSEGV 崩溃。推荐的解决方案是在 configure 时通过CFLAGS覆盖默认值./configure CFLAGS-DFD_SETSIZE64 -g -O24.3 RISC OS用 gccsdk 交叉编译CCriscos-gcc ARriscos-ar RANLIBriscos-ar -s ./configure \ --hostarm-riscos-aof --without-random --disable-shared make其中riscos-gcc和riscos-ar是指向 gccsdk 工具的链接。编译产物为c-ares/lib/.libs/libcares.a可直接链接进你的程序。4.4 Android基于 NDK 独立工具链使用 configure 交叉编译已在 Android NDK r7b 上验证准备独立工具链调用 NDK 的脚本生成标准交叉编译工具链./tools/make-standalone-toolchain.sh假设工具链生成在/opt下然后配置export PATH/opt/arm-linux-androideabi-4.4.3/bin:$PATH ./configure --hostarm-linux-androideabi [more configure options] make从 Git 仓库直接编译的已知坑旧版 automake 可能报如下错误checking host system type... Invalid configuration arm-linux-androideabi: system androideabi not recognized configure: error: /bin/sh ./config.sub arm-linux-androideabi failed修复方法是使用更新版本的config.sub与config.guess可从 GNU config 项目获取替换系统中 automake 目录里的旧版本可用find /usr -name config.sub定位它们。五、CMake 构建现代跨平台方案当前版本的 c-ares 引入了基于 CMake v3 的构建系统已在 Windows、Linux、FreeBSD、macOS、AIX 和 Solaris 等主流平台验证。最基础的构建流程cd /path/to/cmake/source mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease -DCMAKE_INSTALL_PREFIX/usr/local/cares .. make sudo make install5.1 CMake 选项一览CMake 选项通过命令行-D${OPTION}${VALUE}传入取值均为布尔型On / Off / True / False选项名说明默认值CARES_STATIC构建静态库OffCARES_SHARED构建共享库OnCARES_INSTALL挂接安装目标链式构建时可禁用OnCARES_STATIC_PIC以位置无关代码PIC构建静态库OffCARES_BUILD_TESTS构建并运行测试OffCARES_BUILD_CONTAINER_TESTS构建并运行容器测试隐含 CARES_BUILD_TESTS仅 LinuxOffCARES_BUILD_TOOLS构建工具adig、ahost 等OnCARES_SYMBOL_HIDING在共享库中隐藏私有符号OffCARES_THREADS构建线程安全支持On这些选项的定义可对照 CMakeLists.txt 中的OPTION(...)声明逐一确认。此外还包含几个未列入表格但同样有效的选项如CARES_COVERAGE代码覆盖率构建与CARES_MSVC_STATIC_RUNTIMEMSVC 下链接静态运行时库。CMake 与 AutoTools 的一个显著区别AutoTools 一次只能构建共享或静态其中之一需用--disable-shared/--disable-static切换而 CMake 可以同时构建两种形态-DCARES_STATICOn -DCARES_SHAREDOn。5.2 Ninja更快的并行构建Ninja 是面向 CMake 等生成器的下一代构建系统擅长高度并行化。用法与常规构建几乎一致只需指定生成器cd /path/to/cmake/source mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease -DCMAKE_INSTALL_PREFIX/usr/local/cares -G Ninja .. ninja sudo ninja install5.3 Windows MSVC 命令行cd \path\to\cmake\source mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease -DCMAKE_INSTALL_PREFIXC:\cares -G NMake Makefiles .. nmake nmake install5.4 Windows MinGW-w64经 MSYScd \path\to\cmake\source mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease -DCMAKE_INSTALL_PREFIXC:\cares -G MSYS Makefiles .. make make install六、平台专属构建系统6.1 Win32DLL 与 CRT 链接的关键警告构建 Windows DLL 时强烈不建议将 DLL 与静态 CRT 链接在同一应用程序中混用多种 CRT 更是要极力避免。Windows 开发者应通读微软官方《Use the C Run-Time》一文该文是理解 CRT 链接问题的必读材料尤其是当你决定不遵循上述建议时。如果你的应用出现莫名异常或内存损坏在求助前请先尝试将应用及其依赖的所有库统一改用调试版多线程动态 C 运行时重新编译。本仓库的 CMakeLists.txt 提供了CARES_MSVC_STATIC_RUNTIME选项启用时会把编译标志中的/MD动态 CRT替换为/MT静态 CRT这正是文档警告的静态 CRT 场景——仅在确有需要时启用。6.2 MSYS 环境原生 Windows 下 AutoTools 与 CMake 均受支持AutoTools一次只能构建共享或静态版本用--disable-shared或--disable-static控制CMake可同时构建两种。所有 MSYS 环境均被支持MINGW32、MINGW64、UCRT64、CLANG32、CLANG64、CLANGARM64。6.3 MinGW32 传统流程确保 MinGW32 的 bin 目录在搜索路径中然后在根目录运行set PATHc:\mingw32\bin;%PATH% make -f Makefile.m32对应的 Makefile 即仓库根目录的 Makefile.m32。6.4 MSVC 注意事项MSVC 6必须使用 2003 年 2 月版的 PSDK否则构建可能失败。MSVC 命令行构建先运行vcvars32.bat以获取正确的编译环境。该文件位于 Visual C/C 6 默认安装目录的C:\Program Files\Microsoft Visual Studio\vc98\bin下。更多细节参见 README.msvc。6.5 静态链接 c-ares 的重要提示使用静态 c-ares 库构建应用程序时必须在 CFLAGS 中加入-DCARES_STATICLIB否则链接器会去寻找动态导入符号__imp_*导致链接失败。这是静态库使用者最容易踩的坑。6.6 DOSDJGPPc-ares 支持通过 DJGPP 构建为 32 位保护模式应用。官方建议使用 DJGPP 交叉编译器在 DOS 环境内直接构建比较困难并且需要先构建好同编译器编译的 Watt-32 库。构建前必须正确设置DJ_PREFIX和WATT_ROOT两个环境变量然后调用make Makefile.dj对应仓库根目录的 Makefile.dj。完整的构建示例含构建最新 Watt-32 的步骤可参考项目的 CI 工作流djgpp.yml。6.7 IBM OS/2OS/2 下构建与 Unix 差异不大需要准备emx 0.9d、GNU make、GNU patch、ksh、GNU bison、GNU file utilities、GNU sed、autoconf 2.13。两个已知问题的处理链接时报_errno未定义符号需要在定义中加入-D__ST_MT_ERRNO__二进制体积异常庞大多半是 Makefile 的CFLAGS里带了-g。6.8 NetWare编译libcares.a/libcares.lib需要任意 gcc/nlmconv 或 CodeWarrior 7 PDK 4、运行在编译平台上的 GNU make 与 awk、Novell LibC SDK 或 CLib SDK。随后设置编译器/链接器/工具的搜索路径Linux 下需确保OSTYPE变量包含字符串linux并设置NDKBASE指向 Novell NDK 根目录在源码根目录执行make -f Makefile.netware对应 Makefile.netware。七、vcpkg 与 OpenWatcom 构建7.1 vcpkg 依赖管理器Windows 开发者可以使用 vcpkg 依赖管理器一条命令安装 c-ares。流程为克隆 vcpkg 官方仓库并运行引导脚本bootstrap-vcpkg.sh然后执行集成与安装./vcpkg integrate install ./vcpkg install c-aresvcpkg 中的 c-ares port 由微软团队成员和社区贡献者持续维护若版本过旧可在 vcpkg 仓库提交 issue 或 pull request。7.2 OpenWatcom构建 c-ares 需要 OpenWatcom 1.9 及以上版本从 openwatcom 官网下载对应宿主平台的安装包。安装后打开新命令行执行cd \path\to\cmake\source buildconf.bat wmake -u -f Makefile.Watcomwmake完成后会生成adig.exe、ahost.exe以及静态、动态两个版本的 libcares。对应文件为仓库根目录的 Makefile.Watcom。八、已确认支持的平台PORTS以下为 c-ares 已知可编译运行的平台列表可能不完整若有遗漏可向项目反馈Linuxi686、x86_64、AARCH64 等macOS 10.4iOSWindows 8i686、x86_64AndroidARM、AARCH64、x86_64FreeBSD / NetBSD / OpenBSDSolarisSPARC、x86_64AIXPOWERTru64AlphaIRIXMIPSNovell NetWarei386九、仓库实战Fluent Bit 如何链式构建并深度集成 c-aresINSTALL.md 中CARES_INSTALL选项的说明是链式构建者可将其禁用——本仓库正是这一场景的活教材。Fluent Bit 在 cmake/cares.cmake 中直接以子项目方式引入 c-aresFLB_OPTION(CARES_STATIC ON) FLB_OPTION(CARES_SHARED OFF) FLB_OPTION(CARES_INSTALL OFF) FLB_OPTION(CARES_BUILD_TESTS OFF) FLB_OPTION(CARES_BUILD_TOOLS OFF) ... add_subdirectory(${FLB_PATH_LIB_CARES}) set(LIBCARES_LIBRARIES c-ares)对照 INSTALL.md 的选项表可见其决策逻辑静态库CARES_STATICON、不装共享库、不产生安装目标因为链式构建不需要make install、跳过测试与工具最终通过add_subdirectory把libc-ares编入 Fluent Bit 可执行文件。macOS 下还额外定义了CARES_HAVE_ARPA_NAMESER_HSDK 自带arpa/nameser.h对应 CMake 中的特性探测逻辑。在运行期src/flb_network.c 展示了 INSTALL.md 未直接涉及、但同样重要的 API 使用方式flb_net_lib_init()调用ares_library_init_mem(ARES_LIB_INIT_ALL, flb_malloc, flb_free, flb_realloc)把 Fluent Bit 自己的内存分配器注入 c-ares实现内存管理统一每次 DNS 查询前flb_net_dns_lookup_context_create()通过ares_init_options设置ARES_FLAG_EDNS并支持 UDP/TCP 双模式TCP 模式下追加ARES_FLAG_USEVCsrc/flb_network.c通过ares_set_socket_functions注入自定义 socket 回调asocket/aconnect/arecvfrom/asendv等把 c-ares 的底层 I/O 接入 Fluent Bit 的事件循环最终用ares_getaddrinfo发起异步解析并在回调中把结果翻译为 Fluent Bit 内部结构src/flb_network.c。这一集成方式与 INSTALL.md 强调的异步解析、非阻塞 I/O定位完全一致正因 c-ares 提供ares_getaddrinfo这类异步接口并允许替换 socket 函数Fluent Bit 才能把 DNS 查询纳入自己的协程与事件循环避免插件被 DNS 超时阻塞。如果你需要在自有项目中嵌入 c-aresFluent Bit 这套链式 CMake 集成 注入内存分配器 自定义 socket 函数的组合是最值得参考的工业级范式。十、更多信息渠道如需进一步了解 c-ares 的 API 与开发细节可访问 c-ares 官网MinGW-w64、MSYS2、OpenWatcom 等工具链的下载与文档亦可从各自官网获取。本仓库内还提供了 README.md、DEVELOPER-NOTES.md、CONTRIBUTING.md 以及 RELEASE-NOTES.md 供继续深入。【免费下载链接】fluent-bitFast and Lightweight Logs, Metrics and Traces processor for Linux, BSD, OSX and Windows项目地址: https://gitcode.com/GitHub_Trending/fl/fluent-bit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考