使用 Ninja 编译 PortAudio 项目(强烈推荐!!!)

接着上一篇文章,《使用 Visual Studio 2022 编译 PortAudio 项目》

如果出现如下错误:

Jeffrey@Pods UCRT64 /c/Users/Jeffrey/Downloads/portaudio/build/msvs_vs2022 $ cmake ../../ -G "Visual Studio 17 2022" -A x64 -DCMAKE_POLICY_VERSION_MINIMUM=3.5 CMake Deprecation Warning at CMakeLists.txt:7 (CMAKE_MINIMUM_REQUIRED): Compatibility with CMake < 3.10 will be removed from a future version of CMake.

Update the VERSION argument <min> value. Or, use the <min>...<max> syntax to tell CMake that the project requires at least <min> but has been updated to work with policies introduced by <max> or earlier.

-- The C compiler identification is unknown -- The CXX compiler identification is unknown CMake Error at CMakeLists.txt:14 (PROJECT): No CMAKE_C_COMPILER could be found.

CMake Error at CMakeLists.txt:14 (PROJECT): No CMAKE_CXX_COMPILER could be found.

-- Configuring incomplete, errors occurred!

现在的问题是 CMake 找不到 C/C++ 编译器。这是因为您在尝试使用 Visual Studio 生成器,但系统中可能没有正确安装或配置 Visual Studio


解决方案

‌Ninja‌ 是一款专注于编译速度的开源构建工具,通过精简语法和高效并行处理机制,显著提升大型项目的编译效率,被广泛应用于 Chrome、Android、LLVM 等项目中。‌‌

  • 使用现代化的 Ninja 编译的工作流程(推荐方案)
现代构建系统
生成标准
执行
生成
CMakeLists.txt
Ninja
Ninja 文件
Ninja
可执行文件

推荐方案:使用 MinGW 工具链(最适合 UCRT64 环境)

# 回到 portaudio 项目的 build 目录
cd /c/Users/Jeffrey/Downloads/portaudio/build

# 创建新的构建目录
mkdir ninja
cd ninja

# 使用 Ninja 生成器
cmake ../../ -G "Ninja" -DCMAKE_POLICY_VERSION_MINIMUM=3.5

# 编译
ninja

如果需要指定编译器

# 明确指定编译器
cmake ../../ -G "Ninja" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_POLICY_VERSION_MINIMUM=3.5

验证编译器是否可用

# 检查 GCC 是否可用
gcc --version
g++ --version

# 检查是否在 PATH 中
which gcc
which g++

如果使用 Makefile 生成器

# 使用 Unix Makefiles 生成器
cmake ../../ -G "Unix Makefiles" -DCMAKE_POLICY_VERSION_MINIMUM=3.5

# 编译
make

安装缺失的工具(如果需要)

# 确保安装了必要的构建工具
pacman -S mingw-w64-ucrt-x86_64-gcc
pacman -S mingw-w64-ucrt-x86_64-ninja
pacman -S mingw-w64-ucrt-x86_64-make

强烈建议使用 MinGW 工具链而不是 Visual Studio 生成器,因为在 UCRT64 环境中 MinGW 工具链更加自然和兼容。


采用 Ninja 编译

  • 执行命令:
cmake ../../ -G "Ninja" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_POLICY_VERSION_MINIMUM=3.5
  • 输出信息:
Jeffrey@Pods UCRT64 /c/Users/Jeffrey/Downloads/portaudio/build/ninja
$ cmake ../../ -G "Ninja" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_POLICY_VERSION_MINIMUM=3.5
CMake Deprecation Warning at CMakeLists.txt:7 (CMAKE_MINIMUM_REQUIRED):
  Compatibility with CMake < 3.10 will be removed from a future version of
  CMake.

  Update the VERSION argument <min> value.  Or, use the <min>...<max> syntax
  to tell CMake that the project requires at least <min> but has been updated
  to work with policies introduced by <max> or earlier.


-- The C compiler identification is GNU 15.1.0
-- The CXX compiler identification is GNU 15.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: D:/Program Files/msys64/ucrt64/bin/gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/Program Files/msys64/ucrt64/bin/g++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Setting CMAKE_BUILD_TYPE type to 'Debug' as none was specified.
-- Could NOT find ASIOSDK (missing: ASIOSDK_ROOT_DIR ASIOSDK_INCLUDE_DIR)
-- DirectSound support will be built with DSound provided by MinGW.
-- Configuring done (17.0s)
-- Generating done (0.5s)
-- Build files have been written to: C:/Users/Jeffrey/Downloads/portaudio/build/ninja

根据上面的 CMake 配置输出信息,以下是详细解释:


CMake 配置过程分析

1. 弃用警告

CMake Deprecation Warning at CMakeLists.txt:7 (CMAKE_MINIMUM_REQUIRED):
  Compatibility with CMake < 3.10 will be removed from a future version of CMake.
  • 项目使用的 CMake 最低版本要求过低(低于 3.10
  • 建议更新项目中的 CMakeLists.txt 文件以使用更高版本

2. 编译器检测成功

-- The C compiler identification is GNU 15.1.0
-- The CXX compiler identification is GNU 15.1.0
  • 成功检测到 GCC 编译器版本 15.1.0
  • 支持 CC++ 两种语言

3. 编译器路径确认

-- Check for working C compiler: D:/Program Files/msys64/ucrt64/bin/gcc.exe - skipped
-- Check for working CXX compiler: D:/Program Files/msys64/ucrt64/bin/g++.exe - skipped
  • CMake 找到了正确的 UCRT64 环境中的 GCCG++ 编译器
  • 编译器路径位于 MSYS2 安装目录的 ucrt64 子目录中

4. 构建类型设置

-- Setting CMAKE_BUILD_TYPE type to 'Debug' as none was specified.
  • 未指定构建类型,CMake 默认使用 Debug 模式

5. 依赖库检测

-- Could NOT find ASIOSDK (missing: ASIOSDK_ROOT_DIR ASIOSDK_INCLUDE_DIR)
-- DirectSound support will be built with DSound provided by MinGW.
  • 未找到 ASIO SDK(主要用于 Windows 音频专业接口)
  • 将使用 MinGW 提供的 DirectSound 支持

6. 配置结果

-- Configuring done (17.0s)
-- Generating done (0.5s)
-- Build files have been written to: C:/Users/Jeffrey/Downloads/portaudio/build/ninja
  • CMake 配置和生成过程成功完成
  • 构建文件已写入指定目录
  • 整个过程耗时约 17.5

修改建议再次编译

依据执行过程分析,继续改进配置信息:

  • 修改项目中的 CMakeLists.txt 配置
#CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
# CMake 最低版本使用 3.10
CMAKE_MINIMUM_REQUIRED(VERSION 3.10)
  • 执行命令指定构建类型
cmake ../../ -G "Ninja" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_POLICY_VERSION_MINIMUM=3.10 -DCMAKE_BUILD_TYPE=Release

输出信息:

Jeffrey@Pods UCRT64 /c/Users/Jeffrey/Downloads/portaudio/build/ninja
$ cmake ../../ -G "Ninja" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_POLICY_VERSION_MINIMUM=3.10 -DCMAKE_BUILD_TYPE=Release
-- The C compiler identification is GNU 15.1.0
-- The CXX compiler identification is GNU 15.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: D:/Program Files/msys64/ucrt64/bin/gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/Program Files/msys64/ucrt64/bin/g++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Could NOT find ASIOSDK (missing: ASIOSDK_ROOT_DIR ASIOSDK_INCLUDE_DIR)
-- DirectSound support will be built with DSound provided by MinGW.
-- Configuring done (11.6s)
-- Generating done (0.4s)
-- Build files have been written to: C:/Users/Jeffrey/Downloads/portaudio/build/ninja

根据 CMake 配置输出信息,以下是详细分析:

编译器配置

  • C 编译器:使用 GCC 15.1.0 版本
  • C++ 编译器:使用 G++ 15.1.0 版本
  • 编译器路径:位于 D:/Program Files/msys64/ucrt64/bin/ 目录下
  • 构建类型Release 模式

CMake 配置过程

  • CMake 版本要求:最低策略版本 3.10
  • 检测过程CMake 成功检测了编译器 ABI 信息和编译特性
  • 配置时间:总共耗时约 12 秒(配置 11.6s + 生成 0.4s

平台支持情况

ASIO 支持
  • 状态:未找到 ASIOSDK
  • 原因:缺少必要的环境变量 ASIOSDK_ROOT_DIRASIOSDK_INCLUDE_DIR
  • 影响:无法构建 ASIO 音频接口支持
DirectSound 支持
  • 状态:将使用 MinGW 提供的 DSound 库进行构建
  • 说明:这是 Windows 平台下的音频接口支持

开始编译

现在您可以执行 ninja 命令来编译 portaudio 项目:

ninja

这将使用生成的 Ninja 构建文件来编译整个项目。

build-ninja

详细编译步骤:

    1. 进入构建目录
cd C:/Users/Jeffrey/Downloads/portaudio/build/ninja
    1. 执行 Ninja 编译命令:
# 指定并行编译以提高编译速度
ninja -j$(nproc)
# 在 Windows 上,可以指定具体的并行数:
ninja -j4

执行编译输出信息:

Jeffrey@Pods UCRT64 /c/Users/Jeffrey/Downloads/portaudio/build/ninja
$ ls
CMakeCache.txt  build.ninja  cmake_install.cmake    options_cmake.h   portaudio_cmake.def
CMakeFiles      cmake        cmake_uninstall.cmake  portaudio-2.0.pc

Jeffrey@Pods UCRT64 /c/Users/Jeffrey/Downloads/portaudio/build/ninja
$ ninja -j4
[18/44] Building C object CMakeFiles/portaudio.dir/src/hostapi/dsound/pa_win_ds.c.obj
C:/Users/Jeffrey/Downloads/portaudio/src/hostapi/dsound/pa_win_ds.c:54:9: warning: '_WIN32_WINNT' redefined
   54 | #define _WIN32_WINNT 0x0400 /* required to get waitable timer APIs */
      |         ^~~~~~~~~~~~
<command-line>: note: this is the location of the previous definition
[39/44] Building C object CMakeFiles/portaudio_static.dir/src/hostapi/dsound/pa_win_ds.c.obj
C:/Users/Jeffrey/Downloads/portaudio/src/hostapi/dsound/pa_win_ds.c:54:9: warning: '_WIN32_WINNT' redefined
   54 | #define _WIN32_WINNT 0x0400 /* required to get waitable timer APIs */
      |         ^~~~~~~~~~~~
<command-line>: note: this is the location of the previous definition
[44/44] Linking C static library libportaudio.a

编译过程概述

根据提供的 Ninja 编译输出信息,以下是详细分析:

编译统计
  • 总任务数44 个编译任务
  • 完成任务数44个(全部完成)
  • 并行度:使用了 -j4 参数,同时进行 4 个编译任务
编译产物
  • 主要输出libportaudio.a(静态库)
  • 编译目标:包括 portaudioportaudio_static 两个目标

编译配置所有文件产物全在 build/ninja 目录,如下所示:

portaudio-ninja


警告信息分析

警告详情
C:/Users/Jeffrey/Downloads/portaudio/src/hostapi/dsound/pa_win_ds.c:54:9: warning: '_WIN32_WINNT' redefined
#define _WIN32_WINNT 0x0400 /* required to get waitable timer APIs */
警告原因
  1. _WIN32_WINNT 宏在命令行中已经被定义过一次
  2. 在源代码文件 pa_win_ds.c 的第 54 行再次定义该宏
  3. 这会导致前一个定义被覆盖
影响评估
  • 功能影响:无实际功能影响,只是警告
  • 兼容性:设置 _WIN32_WINNT0x0400 是为了使用 Windows 2000API 特性(等待定时器 APIs
  • 代码质量:属于代码规范问题,建议修复以避免潜在冲突

编译架构分析

双目标编译
  • 动态库目标portaudio.dir(用于生成动态链接库)
  • 静态库目标portaudio_static.dir(用于生成静态库)

两个目标都编译了相同的源文件 pa_win_ds.c,因此出现两次相同的警告。

最终链接
  • 输出文件:成功生成了 libportaudio.a 静态库文件
  • 编译状态:所有编译任务成功完成,无错误

建议改进措施

修复警告

在源代码(src/hostapi/dsound/pa_win_ds.c.obj)中添加条件判断避免重复定义:

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400 /* required to get waitable timer APIs */
#endif

项目源代码路径:

object CMakeFiles/portaudio.dir/src/hostapi/dsound/pa_win_ds.c.obj

修改警告源代码后,再次编译,完美通过:

portaudio-ninja

  • 编译产物:
$ ninja -j4
[44/44] Linking C static library libportaudio.a

编译优化

  • 可以考虑增加编译优化选项以提高性能
  • 可以使用更现代的 Windows API 版本定义

后续步骤

编译成功后可以:

  1. 使用 ninja install 安装库文件
  2. 运行测试程序验证功能
  3. 编译示例代码测试库的使用

构建环境总结

这是一个在 Windows 系统上使用 MSYS2/MinGW 工具链配置 PortAudio 构建环境的过程。CMake 成功识别了编译器并完成了基本配置,但缺少 ASIO SDK 导致无法构建完整的专业音频接口支持。如果需要 ASIO 支持,需要下载并配置 ASIO SDK 的路径。

温馨提示:关于 ASIO SDK 的下载配置,此处就不再折腾了,感兴趣的小伙伴自己查阅相关资料。

一、综合实战—使用极轴追踪方式绘制信号灯 实战目标:利用对象捕捉追踪和极轴追踪功能创建信号灯图形 技术要点:结合两种追踪方式实现精确绘图,适用于工程制图中需要精确定位的场景 1. 切换至AutoCAD 操作步骤: 启动AutoCAD 2016软件 打开随书光盘中的素材文件 确认工作空间为"草图与注释"模式 2. 绘图设置 1)草图设置对话框 打开方式:通过"工具→绘图设置"菜单命令 功能定位:该对话框包含捕捉、追踪等核心绘图辅助功能设置 2)对象捕捉设置 关键配置: 启用对象捕捉(F3快捷键) 启用对象捕捉追踪(F11快捷键) 勾选端点、中心、圆心、象限点等常用捕捉模式 追踪原理:命令执行时悬停光标可显示追踪矢量,再次悬停可停止追踪 3)极轴追踪设置 参数设置: 启用极轴追踪功能 设置角度增量为45度 确认后退出对话框 3. 绘制信号灯 1)绘制圆形 执行命令:"绘图→圆→圆心、半径"命令 绘制过程: 使用对象捕捉追踪定位矩形中心作为圆心 输入半径值30并按Enter确认 通过象限点捕捉确保圆形位置准确 2)绘制直线 操作要点: 选择"绘图→直线"命令 捕捉矩形上边中点作为起点 捕捉圆的上象限点作为终点 按Enter结束当前直线命令 重复技巧: 按Enter可重复最近使用的直线命令 通过圆心捕捉和极轴追踪绘制放射状直线 最终形成完整的信号灯指示图案 3)完成绘制 验证要点: 检查所有直线是否准确连接圆心和象限点 确认极轴追踪的45度增量是否体现 保存绘图文件(快捷键Ctrl+S)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChaITSimpleLove

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值