链接到libsndfile

时间:2016-07-14 17:51:49

标签: c windows-7 mingw libsndfile

在我正在进行的项目项目中,我需要能够打开和读取音频文件中的内容(至少是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.hsndfile.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,然后两小时后解决问题。我将发布我的解决方案作为问题的答案。

1 个答案:

答案 0 :(得分:1)

根据this page of the MinGW wiki上的信息,使用MinGW的dlltoollibsndfile-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