接着上一篇文章,《使用 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
编译的工作流程(推荐方案)
推荐方案:使用 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
- 支持
C
和C++
两种语言
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
环境中的GCC
和G++
编译器- 编译器路径位于
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_DIR
和ASIOSDK_INCLUDE_DIR
- 影响:无法构建
ASIO
音频接口支持
DirectSound 支持
- 状态:将使用
MinGW
提供的DSound
库进行构建 - 说明:这是
Windows
平台下的音频接口支持
开始编译
现在您可以执行 ninja
命令来编译 portaudio
项目:
ninja
这将使用生成的 Ninja
构建文件来编译整个项目。
详细编译步骤:
-
- 进入构建目录
cd C:/Users/Jeffrey/Downloads/portaudio/build/ninja
-
- 执行
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
(静态库) - 编译目标:包括
portaudio
和portaudio_static
两个目标
编译配置所有文件产物全在 build/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 */
警告原因
_WIN32_WINNT
宏在命令行中已经被定义过一次- 在源代码文件
pa_win_ds.c
的第54
行再次定义该宏 - 这会导致前一个定义被覆盖
影响评估
- 功能影响:无实际功能影响,只是警告
- 兼容性:设置
_WIN32_WINNT
为0x0400
是为了使用Windows 2000
的API
特性(等待定时器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
修改警告源代码后,再次编译,完美通过:
- 编译产物:
$ ninja -j4
[44/44] Linking C static library libportaudio.a
编译优化
- 可以考虑增加编译优化选项以提高性能
- 可以使用更现代的
Windows API
版本定义
后续步骤
编译成功后可以:
- 使用
ninja install
安装库文件 - 运行测试程序验证功能
- 编译示例代码测试库的使用
构建环境总结
这是一个在 Windows
系统上使用 MSYS2/MinGW
工具链配置 PortAudio
构建环境的过程。CMake
成功识别了编译器并完成了基本配置,但缺少 ASIO SDK
导致无法构建完整的专业音频接口支持。如果需要 ASIO
支持,需要下载并配置 ASIO SDK
的路径。
温馨提示:关于
ASIO SDK
的下载配置,此处就不再折腾了,感兴趣的小伙伴自己查阅相关资料。