使用MinGW调用DirectSound API时遇DirectSoundCreate8未定义引用问题
解决MinGW下DirectSound API链接错误:undefined reference to
DirectSoundCreate8 我之前在MinGW环境下尝试用DirectSound API处理Windows音频输出时,也碰到了一模一样的链接问题,折腾了好一阵才找到正确的解决方式,分享给你:
问题回顾
我最初的操作流程和你几乎一致:
- 安装DirectX SDK,把
dsound.lib复制到自定义的directsound文件夹 - 从mingw-w64仓库下载x86版本的
dsound.h和dsound.def放进该文件夹 - 用命令
dlltool -d dsound.def -l libdsound.a生成静态库 - 在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




