debug


FrontPage

gccでコンパイルするときのバグとその対策についてメモ。

gcc4なら通るのにgcc3でコンパイルエラーになった

あるクラスのメンバになっているfriendクラスのインスタンスを取ってくるとき

class A{
public: 
 friend class B;
};
class B{
};
class C{
public:
 B* binstanse;
}

とするとB*の部分でコンパイルエラー 

before token * うんたらかんたら

gcc3だとエラーする。

friend class B;

をコメントアウトしたら解決。
かっこつけてフレンドクラスなんてつかうものではないな・・

ええもんみつけた

下に添付した

デバッガーgdb とemacs

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の馬鹿野郎・・

静的ライブラリのリンク時にundefined referenceエラーが出る(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を書かなくてはいけない。

-l(ライブラリ名)が見つからない

解決策

/usr/lib  or /usr/local/lib

に動的ライブラリファイル(libライブラリ名.so)
か静的ライブラリファイル (libライブラリ名.a)を置いてみる。

もしくはライブラリ名を指定する前にライブラリが存在するディレクトリの場所(ライブラリパス)を

-L (ディレクトリ)

で指定する。

今のlinuxのデフォルトのファイルシステムELFの場合、
リンクパスからsoファイルを検索し、その後でaファイルを検索する。

最新の20件

2020-11-14 2009-06-06 2009-05-11 2009-03-25 2009-03-24 2009-02-27 2008-12-03 2008-11-03 2008-10-29 2008-08-17 2008-08-13

今日の2件

  • counter: 263
  • today: 1
  • yesterday: 0
  • online: 1