链接到 libsndfile 时未定义的引用和错误的重定位地址

Undefined reference and bad reloc address when linking to 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;
}

但是,当我尝试 compiling/linking:

时,我不断收到 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

link 使用 -llibsndfile-1 处理 .lib 文件

我还复制并重命名了带有 .a 扩展名的 .lib 文件,并尝试 linking 与 -lsndfile-1(这对遇到类似问题的其他人有效),但我得到了确切的当我这样做时出现同样的错误。

如有任何帮助,我们将不胜感激!如果我无法 link 成功访问 libsndfile,是否还有其他简单的库可用于读取音频文件?


编辑: 当然我花了两天时间想办法,最后post到Whosebug,然后两个小时后解决问题。我将 post 我的解决方案作为问题的答案。

根据 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 目录中,因此您可能需要在 OS 中搜索它。

将lib目录中的libsndfile-1.lib替换为libsndfile-1.dll.a然后编译使用:

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