使用mingw-w64静态链接OpenAL Soft遇问题求助
MinGW-w64 + Make构建C项目时OpenAL Soft链接问题解决方法
当前用mingw-w64和make构建C项目,其他库均能正常链接,但OpenAL Soft始终出问题:要么链接阶段提示调用的函数存在未定义引用(不调用相关函数则无报错),要么生成可执行文件后运行时因缺失DLL直接崩溃,后者曾出现过一次但无法复现。不使用CMake,仅需基于gcc命令的解决方案。
参考的基础Makefile:
CC=gcc OPTS=-Iinclude -static LIBS=-Llib -lglfw3 -lopengl32 -lgdi32 all: proj proj: src/*.c $(CC) $(OPTS) $^ -o $@ $(LIBS)
此前尝试的两种失败方案:
- 下载了标注为“适用于OpenGL的OpenAL音频库(mingw-w64)”的文件(实际关联OpenAL Soft仓库),单独使用其中的.a文件无效,梳理依赖时发现gcc-libs和libwinpthread文件夹内无.a文件,用现有.a构建仍出现函数未定义错误。
- 查阅Stack Overflow相关问题,该问题讨论的是常规OpenAL而非OpenAL Soft,其中一条评论提到编译源码可在mingw-w64中使用OpenAL Soft,但未说明具体操作步骤。
方案1:通过MSYS2安装预编译OpenAL Soft(最简便)
- 打开MSYS2的mingw64终端,执行以下命令安装库:
pacman -S mingw-w64-x86_64-openal-soft - 修改项目Makefile:
- 若系统未自动包含头文件路径,在
OPTS后追加-I/mingw64/include - 在
LIBS后追加-lopenal - 若需要静态链接,调整
LIBS为:LIBS=-Llib -lglfw3 -lopengl32 -lgdi32 -lopenal -static-libgcc -static-libstdc++
- 若系统未自动包含头文件路径,在
- 运行
make构建项目:- 动态链接时,需将mingw64/bin目录下的
libopenal-1.dll复制到可执行文件同目录;静态链接则无需额外DLL。
- 动态链接时,需将mingw64/bin目录下的
方案2:手动编译OpenAL Soft源码
- 获取OpenAL Soft源码后,打开mingw64终端进入源码目录
- 生成Makefile(以静态库为例,动态库将
OFF改为ON):cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF . - 编译源码:
mingw32-make - 复制编译产物到项目目录:
- 将源码include目录下的头文件复制到项目的
include目录 - 将编译生成的
libopenal.a(静态)或libopenal.dll.a+libopenal.dll(动态)复制到项目的lib目录
- 将源码include目录下的头文件复制到项目的
- 修改项目Makefile:
- 静态链接时,在
LIBS后追加依赖库:LIBS=-Llib -lglfw3 -lopengl32 -lgdi32 -lopenal -lpthread -lwinmm -ldsound -lkernel32 - 动态链接时,仅需在
LIBS后追加-lopenal,运行时将libopenal.dll放到可执行文件同目录
- 静态链接时,在
内容的提问来源于stack exchange,提问作者ElvisCrespo33
相关产品推荐
相关产品推荐

