2016-07-14 14 views
2

私が取り組んでいるプロジェクトプロジェクトでは、オーディオファイル(少なくともWAVファイル)からコンテンツを開いて読み込めるようにする必要があります。私はmega-nerd.comのWin64インストーラを使用してlibsndfileをインストールし、ライブラリをテストするためのオーディオファイルを開いたり閉じたりする簡単なCプログラムを作成しました。libsndfileにリンクするときの未定義参照と不正なリロケーションアドレス

#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

ヘッダーとライブラリのディレクトリはコンパイラの検索パスに含まれていますが、ライブラリを見つけるのに問題はありません。私はまた、コピーした.a拡張子を持つの.libファイルを名前を変更し、(これは同様の問題を持つ他の誰かのために働いていた)-lsndfile-1とリンクしようとしたinstructions on the minGW wiki

あたりとして-llibsndfile-1との.libファイルをリンクしますが、私よ私がそうするとき、まったく同じエラーを得る。

助けていただけたら幸いです!私がlibsndfileにうまくリンクできない場合は、オーディオファイルからの読み込みに使用できる他の単純なライブラリがありますか?


編集:私は解決策を見つけようと2日間を過ごすもちろん、最終的にはStackOverflowのために掲示した後、2時間後に問題を解決します。質問に対する答えとして私の解決策を掲載します。

+2

:あなたはそれの両方があるで、ラインであることを確認してくださいあなたのMinGWのインストールとライブラリのビット幅です32ビットまたは64ビット? – alk

+0

このコマンドで試してみてください: 'gcc -Wall -o sndfile_test.exe sndfile_test.c -lsndfile' – user3078414

+0

@alk - My MinGWのインストールは間違いなく64bitで、ダウンロードした64bitインストーラーを使ってライブラリをインストールしました。それによって構築されたライブラリも64ビットです... @ user3078414 - -lsndfileでリンクすると 'can not find -lsndfile'というエラーが返されますが、提案していただきありがとうございます –

答えて

1

this page of the MinGW wikiの情報に続いて、libsndfile-1.defファイルでMinGWのdlltoolを使用して、dllのインポートライブラリを再作成します。そうする

このコマンドを使用:

dlltool -d libsndfile-1.def -l libsndfile-1.dll.a 

は、これはあなたがの.libファイルの代わりに使用することができます.dll.aファイルを作成します。私がこれをしたとき、上記のコマンドを実行したときのディレクトリに.dll.aファイルが表示されなかったことに注意してください。それは私の\ AppDataディレクトリに隠されてしまったので、OSを検索しなければならないかもしれません。

libsndfile-1.dll.aであなたのlibディレクトリにlibsndfile-1.libを交換してから使用してコンパイル:青のうち

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

あなたも勝利の回答を受け入れることができます。 – alk

関連する問題