2016-07-14 141 views
2

在我正在開發的項目項目中,我需要能夠打開並從音頻文件(至少是WAV文件)中讀取內容。我使用mega-nerd.com的Win64安裝程序安裝了libsndfile,並創建了一個簡單的C程序,用於打開和關閉音頻文件以測試該庫。鏈接到libsndfile時未定義的引用和錯誤的reloc地址

#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

頭文件和庫目錄包含在編譯器的搜索路徑中,它似乎不是查找庫的問題?我鏈接的.lib文件每instructions on the minGW wiki

-llibsndfile-1我也複製和重命名與.a擴展名的文件.LIB並試圖與-lsndfile-1鏈接(這個工作別人有類似的問題),但我當我這樣做的時候得到完全相同的錯誤。

任何幫助,將不勝感激!如果我無法成功鏈接到libsndfile,是否還有其他簡單的庫可供我從音頻文件中讀取?


編輯:當然,我花兩天時間試圖找到解決辦法,最後發佈到計算器,然後兩個小時後解決問題。我將發佈我的解決方案作爲對問題的回答。

+2

出於藍:你確定你的MinGW的安裝和庫位寬度都符合,那就是兩者都32位還是64位? – alk

+0

嘗試使用此命令:'gcc -Wall -o sndfile_test.exe sndfile_test.c -lsndfile' – user3078414

+0

@alk - 我的MinGW安裝絕對是64位的,並且該庫使用下載的64位安裝程序進行安裝,所以我只能假設由它構建的庫是64位以及... @ user3078414 - 鏈接與-lsndfile返回一個'無法找到-lsndfile'錯誤,但感謝您的建議 –

回答

1

關於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.lib在你的lib目錄與libsndfile-1.dll.a,然後編譯使用:

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

你也可以很好地接受你的答案。 – alk

相關問題