【发布时间】:2016-11-17 18:30:31
【问题描述】:
在我正在进行的项目项目中,我需要能够打开和读取音频文件(至少是 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 函数引用错误,以及错误的 reloc 地址错误:
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
header和library目录都包含在编译器的搜索路径中,找库好像没有问题吧?我根据instructions on the minGW wiki 将.lib 文件与-llibsndfile-1 链接
我还复制并重命名了带有 .a 扩展名的 .lib 文件,并尝试使用 -lsndfile-1 链接(这适用于遇到类似问题的其他人),但这样做时我得到了完全相同的错误。
任何帮助将不胜感激!如果我无法成功链接到 libsndfile,是否还有其他简单的库可以用来读取音频文件?
编辑:当然我花了两天时间试图找到解决方案,最后发布到stackoverflow,然后在两个小时后解决问题。我将发布我的解决方案作为问题的答案。
【问题讨论】:
-
出乎意料:您确定您的 MinGW 安装和库的位宽是一致的,即都是 32 位还是 64 位?
-
试试这个命令:
gcc -Wall -o sndfile_test.exe sndfile_test.c -lsndfile -
@alk - 我的 MinGW 安装肯定是 64 位的,并且库是使用下载的 64 位安装程序安装的,所以我只能假设它构建的库也是 64 位的...... @user3078414 -与 -lsndfile 链接返回
cannot find -lsndfile错误,但感谢您的建议
标签: c windows-7 mingw libsndfile