You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

使用MinGW调用DirectSound API时遇DirectSoundCreate8未定义引用问题

解决MinGW下DirectSound API链接错误:undefined reference to DirectSoundCreate8

我之前在MinGW环境下尝试用DirectSound API处理Windows音频输出时,也碰到了一模一样的链接问题,折腾了好一阵才找到正确的解决方式,分享给你:

问题回顾

我最初的操作流程和你几乎一致:

  1. 安装DirectX SDK,把dsound.lib复制到自定义的directsound文件夹
  2. 从mingw-w64仓库下载x86版本的dsound.hdsound.def放进该文件夹
  3. 用命令dlltool -d dsound.def -l libdsound.a生成静态库
  4. 在CLion的CMakeLists.txt里配置了链接目录、头文件目录,并链接dsound

但编译时直接弹出链接错误:

[ 50%] Building CXX object CMakeFiles/fourier.dir/main.cpp.obj
[100%] Linking CXX executable fourier.exe
CMakeFiles\fourier.dir/objects.a(main.cpp.obj): In function `main':
PATHTOPROJECT/main.cpp:11: undefined reference to `DirectSoundCreate8'
collect2.exe: error: ld returned 1 exit status

正确的解决步骤

经过调整,以下操作可以彻底解决这个问题:

1. 生成正确的.def文件

直接用mingw-w64仓库的.def文件可能存在兼容性问题,我们需要从官方的dsound.lib提取导出函数信息,生成适配MinGW的.def文件:

reimp -c -d dsound.lib

2. 生成正确的静态库文件libdsound.a

之前的dlltool命令缺少关键参数,正确的命令应该是:

dlltool -D dsound.dll -d dsound.def -l libdsound.a -k

参数说明:

  • -D dsound.dll:明确指定对应的动态链接库文件名
  • -k:保留函数名的下划线前缀,这是MinGW链接器识别函数的关键设置

3. 确保动态库文件位置正确

将系统中的dsound.dll(一般在C:\Windows\System32目录,x86版本注意找对应路径)复制到你的可执行文件输出目录下,也就是和fourier.exe同目录。

4. 优化CMake配置(可选)

原来的CMakeLists.txt配置基本没问题,但可以做小优化:MinGW环境下#pragma comment(lib, "libdsound.a")是无效的,直接删掉这一行即可,因为我们已经通过CMake的target_link_libraries配置了链接。

调整后的CMakeLists.txt示例:

cmake_minimum_required(VERSION 3.9)
project(fourier)
set(CMAKE_CXX_STANDARD 11)
# 替换成你的directsound文件夹实际路径
link_directories(${CMAKE_SOURCE_DIR}/directsound)
include_directories(${CMAKE_SOURCE_DIR}/directsound)
add_executable(fourier main.cpp)
target_link_libraries(fourier dsound)

这样重新编译后,链接错误就会消失,DirectSoundCreate8函数可以正常被调用了。

内容的提问来源于stack exchange,提问作者SchokoTets

火山引擎 最新活动