【问题标题】:Undefined reference and bad reloc address when linking to libsndfile链接到 libsndfile 时未定义的引用和错误的 reloc 地址
【发布时间】: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.hsndfile.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


【解决方案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 目录中,因此您可能需要在操作系统中搜索它。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-18
    • 2016-06-10
    • 2015-01-23
    • 2014-02-13
    • 1970-01-01
    • 2016-04-02
    • 2014-04-21
    • 2013-03-15
    相关资源
    最近更新 更多