2

これが私のC++クラスで、一部はクラス内で定義され、一部は外部です。問題: nm を実行すると、クラス宣言で定義された関数がオブジェクト ファイルに表示されないことが明らかになりますが、外部の関数は表示されます。クラス内のシンボルをオブジェクトファイルにも表示するにはどうすればよいですか? g++ 4 シリーズを使用しています。

class A {
  public: 
    void this_will_not_show_up() { };
    void this_will_show_up();
};
void A::this_will_show_up() { }
4

1 に答える 1

1

クラス定義でインラインで定義された関数は、インライン関数としてコンパイルされます。つまり、この関数のコードは、呼び出し元の関数に「コピー」されます。したがって、インライン関数の専用の実装はなく、リンカー シンボルもありません。

メソッド non-inline をコンパイル単位で定義すると、この関数が別のコンパイル単位から呼び出される可能性があります。したがって、この実装には、リンクできる関数が必要です。コンパイラは、ヘッダーとリンカー マップにある (装飾された) 名前を含む関数を生成するだけです。

コンパイラが使用する必要があるものはすべてヘッダー ファイルで定義されているため、これを共有ライブラリで使用しても問題ありません。ほぼ完全にヘッダーのみとして実装されている STL のようなライブラリがあります。

于 2013-04-17T04:32:43.170 に答える