在我正在进行的项目项目中,我需要能够打开和读取音频文件中的内容(至少是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函数提取未定义的引用错误,加上错误的重定位地址错误:
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,然后两小时后解决问题。我将发布我的解决方案作为问题的答案。
答案 0 :(得分:1)
根据this page of the MinGW wiki上的信息,使用MinGW的dlltool
和libsndfile-1.def
文件重新创建dll的导入库。
使用此命令执行此操作:
dlltool -d libsndfile-1.def -l libsndfile-1.dll.a
这将创建可以使用的.dll.a文件,而不是.lib文件。请注意,当我这样做时,.dll.a文件没有出现在执行上述命令时我所在的目录中。它最终隐藏在我的\ AppData目录中,因此您可能需要在操作系统中搜索它。
用libsndfile-1.lib
替换lib目录中的libsndfile-1.dll.a
,然后使用:
gcc -Wall -o sndfile_test.exe sndfile_test.c -lsndfile-1