gccでコンパイルするときのバグとその対策についてメモ。
class A{ public: friend class B; }; class B{ }; class C{ public: B* binstanse; }
とするとB*の部分でコンパイルエラー
before token * うんたらかんたら
gcc3だとエラーする。
friend class B;
をコメントアウトしたら解決。
かっこつけてフレンドクラスなんてつかうものではないな・・
下に添付した
http://granada.sakura.ne.jp/naota/edu/gdb1.pdf
#define MAX void main(){ int min = n; int distance = (MAX - min) / 2; }
でエラー
distance = MAX - min; distance /= 2;
なら大丈夫・・
gccの馬鹿野郎・・
概要 gccでリンク時にundefined referenceエラーが出る場合がある。通常はオブジェクトやライブラリの指定忘れが原因であるが、静的ライブラリをリンクする順番に間違いがあって出る場合もある (自分でMakefileを書く場合にこのミスをすることが多い)
リンクの順番には依存性があり、あるオブジェクトが静的ライブラリ内の関数を呼び出すときには呼び出される側のライブラリは「後で」リンクする必要がある。
例えば foo.o が静的ライブラリ libfoo.a 内の関数を使用している、つまり
foo.o → libfoo.a
という依存関係があるとき、
g++ -o foo libfoo.a foo.o
とするとundefined referenceエラーが出る。従って
g++ -o foo foo.o libfoo.a
と先にfoo.oを書かなくてはいけない。
解決策
/usr/lib or /usr/local/lib
に動的ライブラリファイル(libライブラリ名.so)
か静的ライブラリファイル (libライブラリ名.a)を置いてみる。
もしくはライブラリ名を指定する前にライブラリが存在するディレクトリの場所(ライブラリパス)を
-L (ディレクトリ)
で指定する。
今のlinuxのデフォルトのファイルシステムELFの場合、
リンクパスからsoファイルを検索し、その後でaファイルを検索する。