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"

一応メモしておく

2012/07/16

Bsurfacesの日本語訳ヘルプ

http://ikaflower.org/ja/bsurfaces/

BlenderのリトポロジーのプラグインBsurfacesのヘルプを日本語に訳した。

2012/07/03

ico形式用のStirling構造体定義ファイル

バイナリエディタStrilingの構造体定義ファイルを作成した。

Stirlingの構造体編集機能はバイナリのデータを見るときに便利な機能で、構造体をC++のソースのように定義しておけば、バイナリのデータを表で見ながら編集することができる。構造体を内包している構造体も定義できる。

ICOファイルのフォーマットの詳細は以下のページが詳しかった。

http://www14.ocn.ne.jp/~setsuki/ext/ico.htm

さて、画像データのヘッダはBitmapInfoHeaderでBMPと同じものなので、定義はIconFileHeaderとIconInfoHeaderを書くだけで済んだ。BitmapInfoHeaderは付属のstruct.defにある)

以下をstruct.defの末尾に追加してください。

struct.def

struct IconFileHeader
{
 WORD icoReserved;
 WORD icoResourceType;
 WORD icoResourceCount;
};

struct IconInfoHeader
{
 BYTE Width;
 BYTE Height;
 BYTE Reserved1;
 WORD Reserved2;
 WORD Reserved3;
 DWORD icoDIBSize;
 DWORD icoDIBOffset;
};

IconFileHeaderは、アイコン一枚のケースが多いのでだいたい00 00 01 00 01になる。

「stirling 構造体」で検索してこられる方が多いので追記

「構造体」を表示するということは、バイナリを何バイトかずつに分けて、見やすく表示するということです。

構造体自体は元々プログラミングの用語で、その名のとおり構造をもったデータのことです。

じゃ、Tomoedaという名前の構造体をつくり、そのなかにKinomotoという1バイトのデータを入れてみます。

struct Tomoeda
{
 BYTE Kinomoto;
};

換言すれば、

struct 構造体の名前
{
 データ;
};

ということです。末尾の;(セミコロン)は、データの定義などの終端を表します。

データのほうは、以下のように定義します。

データの大きさ データの名前;

Kinomotoはデータの大きさが1バイトなのでBYTEになります。2バイトならWORD、4バイトならDWORDとします。

LONG(4バイト)というものもありますが、よその定義では定義が違ったりと曖昧なので使わないようにしてます。

たまにデータの名前にこんな[数字]がついていることがあります。

BYTE Kinomoto[3];

たとえば木之本さん一家の年齢のデータが、2B 11 0Aという3バイトで入っているとします。Kinomoto1、Kinomoto2、Kinomoto3というデータ名で1バイトずつ分けることもできますが、そんな命名をしていたら時間がかかるので、[総数]とデータの名前のあとに書くことで、総数分のデータであるというふうにかけるわけです。

いわゆる配列ですね。お役に立てたら幸いです。