GCCリンカは、2つのファイルで1つの変数が定義されていることを気にしません。私はこれが第三者の図書館が私たちを引き起こしているトラブルの原因だと思う。共有ライブラリの変数の重複定義を検出する
これを持っ:
ファイルa.cppが含まれています
int foo;
//do things with it.
ファイルb.cppが含まれています
int foo;
//do other things with it.
ファイルc.cppが含まれています
extern int foo;
//do other things with it.
それらはすべてgccによってコンパイルされます.oファイルを共有オブジェクトとしてリンクします。
gcc -fPIC -c a.cpp
gcc -fPIC -c b.cpp
gcc -fPIC -c c.cpp
ld *.o -shared -soname,mylib -o mylib
リンカーは、まったく文句を言いませんが、結果として生じるバイナリは正しくありません。私たちは、少なくともこの種の紛争がいくつかあり、それを見つけたいと思っています。どのような種類のリンカーオプションで検出できますか?
(興味深いことに、両方のファイルで変数が初期化されている場合(int foo=0
)、エラーが発生します)。
私は同意していることが多く、はいです。時には原作者の動機を理解することで頭が痛む。ときには、静的であることが必要な場合もあれば、場合によってはexternであることもあります。 –