編集--私の質問の目標を明確にする:リンカーが報告することを期待している問題の診断に多くの時間を費やしています.別のものに変更し、それを変更します。
コンパイル/リンク時にこの問題を検出する方法を探しています。
このセットアップでは:
ああ
void foo();
A.cpp
struct A {
int values[100];
A(){
std::cout << __FILE__ << ": A::A()\n";
}};
void foo(){
A a;
}
main.cpp
#include "A.h"
struct A {
double values[100];
A(){
std::cout << __FILE__ << ": A::A()\n";
}};
int main(){ foo(); }
// void foo(){} ===> this would cause a linker error
A
structureまたは少なくとも constructorA::A()
が 2 回定義されていることをリンカーに報告してもらいたいと思います。
ただし、g++ 4.4 は問題なくリンクします。コードを実行すると、この場合、リンカがA
from A.cpp の使用を選択したことがわかります。
$ g++ -Wall A.cpp main.cpp && ./a.out
A.cpp:3
A.cpp:7
A.cpp:3
関数 が 2 つのオブジェクト ファイルに存在する場合foo()
、リンカーは複数の定義を問題なく報告しますが、構造体については報告しません。
編集: nm -C *.o
Ao と main.o の両方が弱いシンボルA::A()
として定義されていることを使用して発見されました。これにより、同じ名前のシンボルのプールから「選択可能」になります。おそらく、この質問は「コンパイラに強力なシンボルを生成させるにはどうすればよいですか?」と言い換えることができます...
00000000 W A::A()
この問題を検出するにはどうすればよいですか?