链接到 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.h
和 sndfile.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 的 dlltool
和 libsndfile-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
在我正在处理的项目中,我需要能够打开和读取音频文件(至少是 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.h
和 sndfile.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 的 dlltool
和 libsndfile-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