在我正在处理的项目中,我需要能够打开音频文件(至少是 WAV 文件)并从中读取内容。我使用 mega-nerd.com 中的 Win64 安装程序安装了 libsndfile ,并创建了一个简单的 C 程序来打开和关闭音频文件以测试库。
#include <stdio.h>
#include <sndfile.h>
int main()
{
SNDFILE *sndfPtr;
SF_INFO soundfileInfo;
char path[] = "C:\\Users\\jayb\\Documents\\MusicClips\\violin.wav";
printf( "Path: %s\n", path );
/* Open soundfile for reading */
soundfileInfo.format = 0; /* Must be set to zero before opening */
sndfPtr = sf_open( path, SFM_READ, &soundfileInfo );
if( sndfPtr == NULL )
{
fprintf( stderr, "Error: %s\n", sf_strerror(NULL) );
return -1;
}
/* Close soundfile and check for error */
if( sf_close( sndfPtr ) )
{
fprintf( stderr, "There was an error closing the soundfile\n" );
return -1;
}
return 0;
}
但是,当我尝试编译/链接时,我不断收到 libsndfile 函数的 undefined reference 错误,以及错误的重定位地址错误:
C:\Users\jbiernat\AppData\Local\Temp\ccSmO0dw.o:sndfile_test.c:(.text+0xbb): undefined reference to `sf_open'
C:\Users\jbiernat\AppData\Local\Temp\ccSmO0dw.o:sndfile_test.c:(.text+0xd8): undefined reference to `sf_strerror'
C:\Users\jbiernat\AppData\Local\Temp\ccSmO0dw.o:sndfile_test.c:(.text+0x10a): undefined reference to `sf_close'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: C:\Users\jbiernat\AppData\Local\Temp\ccSmO0dw.o: bad reloc address 0x20 in section `.eh_frame'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status
我正在使用这个命令进行编译:
gcc -Wall -o sndfile_test.exe sndfile_test.c -llibsndfile-1
libsndfile 的安装带有头文件 sndfile.h
和 sndfile.hh
,以及 .lib、.def 和 .dll 文件:libsndfile- 1.lib libsndfile-1.def libsndfile-1.dll
头文件和库目录都包含在编译器的搜索路径中,貌似不是找库的问题?我根据 instructions on the minGW wiki 将 .lib 文件与 -llibsndfile-1
链接起来
我还使用 .a 扩展名复制并重命名了 .lib 文件,并尝试使用 -lsndfile-1
进行链接(这对遇到类似问题的其他人有效),但我得到的结果完全相同这样做时出错。
任何帮助将不胜感激!如果我无法成功链接到 libsndfile,是否还有其他简单的库可用于读取音频文件?
编辑:当然我花了两天时间想办法,最后发布到stackoverflow,然后两个小时后解决了问题。我将发布我的解决方案作为问题的答案。
最佳答案
根据 this page of the MinGW wiki 上的信息,使用 MinGW 的 dlltool
和 libsndfile-1.def
文件重新创建 dll 的导入库。
使用此命令执行此操作:
dlltool -d libsndfile-1.def -l libsndfile-1.dll.a
这将创建您可以用来代替 .lib 文件的 .dll.a 文件。请注意,当我这样做时,.dll.a 文件并没有出现在我执行上述命令时所在的目录中。它最终隐藏在我的\AppData 目录中,因此您可能需要在您的操作系统中搜索它。
用 libsndfile-1.dll.a
替换 lib 目录中的 libsndfile-1.lib
然后编译使用:
gcc -Wall -o sndfile_test.exe sndfile_test.c -lsndfile-1
关于c - 链接到 libsndfile 时 undefined reference 和错误的重定位地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38380985/