2012/07/31

gccのコンパイルエラーで、ライブラリファイルが読み込めないときの対処

gcc -o hoge.obj -c hoge.c
gcc -o hoge.exe hoge.obj -L"c:\msysgit\msysgit\mingw\lib\" -l"libws2_32.a"

winsock2を使ったプログラムを作った。そしてmingw+gccの環境で上記のようにコンパイル(&リンク)させようとしたところ、以下のような「ファイルが見つからない」というエラーがでた。

c:/msysgit/msysgit/mingw/bin/../lib/gcc/mingw32/4.4.0/../../../../mingw32/bin/ld.exe: cannot find -llibws2_32.a
collect2: ld returned 1 exit status

ファイルの場所を確認してもlibws2_32.aファイルはたしかに存在するので、検索してみた。

海外のサイトによると、リンカー(ld.exe)はlibや.aのないファイル名が欲しいらしい。

というわけで、libと.aを取り払って以下のようにすると成功した。

gcc -o hoge.obj -c hoge.c
gcc -o hoge.exe hoge.obj -L"c:\msysgit\msysgit\mingw\lib" -l"ws2_32"

それを確かめたあと、コマンドラインのヘルプを見に行くと答えがわかった(順番が違ったね…)。

ファイル名を指定するのであれば、そのままファイル名を書けばよく、ライブラリかオブジェクトかはプログラムが判断するという。

-lオプションはlibと.aをつけて検索してくれる便利なオプションだった。

`-l'オプションを使うこととファイル名を指定することの唯一の違いは、 `-l'オプションの場合には、 libraryの前後に`lib'と`.a'とが付加されて、 いくつかのディレクトリが探索されるという点にあります。
gcc -o hoge.obj -c hoge.c
gcc -o hoge.exe hoge.obj "c:/msysgit/msysgit/mingw/lib/libws2_32.a"

一応メモしておく

コメントを投稿