c - 链接到 libsndfile 时 undefined reference 和错误的重定位地址

标签 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 函数的 undefined reference 错误,以及错误的重定位地址错误:

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,然后两个小时后解决了问题。我将发布我的解决方案作为问题的答案。

最佳答案

根据 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.dll.a 替换 lib 目录中的 libsndfile-1.lib 然后编译使用:

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

关于c - 链接到 libsndfile 时 undefined reference 和错误的重定位地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38380985/

相关文章:

windows-7 - 在Windows 7/8/10上安装VB6

C# windows 窗体在 Windows 7 中崩溃

c++ - cimg display() 什么也没有,但调试消息是正确的

python - 使用 cygwin、dlltool 构建 64 位 libpython27.a

c - 基础问题 : Best Practices concerning Posix Threads and Dynamic Memory

c++ - 套接字编程中非法查找的可能原因

c++ - 更改 GStreamer 上的视频格式

c - 有什么方法可以重命名 gcc 编译的 .o 或 .a 文件中的节名称?

windows-7 - VMWare Windows 7 客户机中存在巨大的时间漂移

python - 使用 Pip 安装 Python 包时如何使用 MinGW 的 gcc 编译器?