2016-07-14 145 views
2

在我正在开发的项目项目中,我需要能够打开并从音频文件(至少是WAV文件)中读取内容。我使用mega-nerd.com的Win64安装程序安装了libsndfile,并创建了一个简单的C程序,用于打开和关闭音频文件以测试该库。链接到libsndfile时未定义的引用和错误的reloc地址

#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.hsndfile.hh和.LIB,.DEF和.dll文件:libsndfile-1.lib libsndfile-1.def libsndfile-1.dll

头文件和库目录包含在编译器的搜索路径中,它似乎不是查找库的问题?我链接的.lib文件每instructions on the minGW wiki

-llibsndfile-1我也复制和重命名与.a扩展名的文件.LIB并试图与-lsndfile-1链接(这个工作别人有类似的问题),但我当我这样做的时候得到完全相同的错误。

任何帮助,将不胜感激!如果我无法成功链接到libsndfile,是否还有其他简单的库可供我从音频文件中读取?


编辑:当然,我花两天时间试图找到解决办法,最后发布到计算器,然后两个小时后解决问题。我将发布我的解决方案作为对问题的回答。

+2

出于蓝:你确定你的MinGW的安装和库位宽度都符合,那就是两者都32位还是64位? – alk

+0

尝试使用此命令:'gcc -Wall -o sndfile_test.exe sndfile_test.c -lsndfile' – user3078414

+0

@alk - 我的MinGW安装绝对是64位的,并且该库使用下载的64位安装程序进行安装,所以我只能假设由它构建的库是64位以及... @ user3078414 - 链接与-lsndfile返回一个'无法找到-lsndfile'错误,但感谢您的建议 –

回答

1

关于this page of the MinGW wiki的信息,请使用MinGW的dlltoollibsndfile-1.def文件重新创建dll的导入库。

使用此命令可以这样做:

dlltool -d libsndfile-1.def -l libsndfile-1.dll.a 

这将创建一个可以使用的替代的.lib文件.dll.a文件。请注意,当我这样做时,当执行上述命令时,.dll.a文件未出现在我所在的目录中。它最终隐藏在我的\ AppData目录中,所以您可能必须在您的操作系统中搜索它。

更换libsndfile-1.lib在你的lib目录与libsndfile-1.dll.a,然后编译使用:

gcc -Wall -o sndfile_test.exe sndfile_test.c -lsndfile-1 
+0

你也可以很好地接受你的答案。 – alk

相关问题