1

私はどの言語や GCC の専門家でもありません。だから私の質問は標準以下かもしれません。

GCC を使用して、何千もの CPP ファイルでコード ベースを構築しています。ファイルで、 [定義されたクラスのクラスメソッド定義を含む]A.cppでいくつかの関数を呼び出しているとします。ビルドはOKでした。しかし、その後、メイクファイルから除外しました。そのため、オブジェクトファイルは作成されません。しかし、この場合、から関数を参照しているため、コンパイルまたはリンクの段階でエラーが発生することが予想されていました。しかし、何もなく、コードはエラーなしでビルドされます。しかし、fn呼び出しを別のファイルに移動すると、リンカエラーが発生しました。これは、予想される動作であると私は信じています。B.cppB.cppB.hB.oB.oA.cppB.cppA.cppC.cpp

これは予想される動作ですか?また、ビルド中に作成されたすべての関数名をリストしたマップ ファイルを確認したところ、B.cppB.cpp のオブジェクト ファイルが作成されていなくても、関数がマップに存在していました。私の質問は、ビルドの一部ではないファイルから関数を呼び出したときにエラーが発生しなかった理由です。存在する可能性のある残留物をクリーンアップするために、以前のビルドからすべてのオブジェクト ファイルとバイナリを削除しようとしましたが、役に立ちませんでした。手がかりがありません。誰でも助けを提供できますか?

私のマップファイルでは、通常の関数は次のようにリストされています

80010820 T __gccmain

80010828 t __gccmain_end

しかし、B.cpp の fns は次のようにリストされています。

U CNvThread::ProcMsgReq(unsigned, void*)

U CNvDbMgrThread::Singleton(unsigned long)

4

3 に答える 3

1

B.o以前のビルドからまだそこにある場合は、古いコピーに対して問題なくリンクします (何か大きな変更がない限り)。最終的な実行可能ファイルをビルドせずに のみをビルドした場合でも、 はからの関数を参照するA.oため問題ありませんが、最終的な出力ファイル リンクまではリンクされません。A.oB

繰り返しB.oますが、以前のビルドからまだ存在する場合は、それが使用されます。これが、マップ ファイルに表示される理由です。

于 2013-01-09T03:55:16.593 に答える
1

「makefile」があるようですね。

デフォルトでは、「make」は (通常) プロジェクトをビルドしようとします。とにかく、それは標準的な慣習です。

通常、make には他の「ターゲット」もあります。たとえば、「make clean」または「make cleanall」と入力できます。これらのターゲットが存在する場合、バイナリが削除されるため、最初から再構築できます。

「make」を再実行すると、最後のビルドから古いバイナリが取得されたのではないかと思います。存在するか確認しましたか?

そうでなければ、あなたのプロジェクトはそもそも実際にそれを必要としなかったと思います:)

これを確認するには、"ld -M" を実行してマップ (相互参照を含める必要があります) を生成することをお勧めします。

于 2013-01-09T03:56:21.553 に答える
0

作成された行A.o#if.

#if (OBJ_A_SUPPORTED)

A* a = new A();

#endif

OBJ_A_SUPPORTED 定義が移動されたヘッダー ファイル。

これにより、リンカーは A.cpp から fns を除外し、次に fns の呼び出しを削除しましたB.cpp。したがって、リンカーエラーはありませんでした。マップファイルをよく見ると、私が完全に見逃していたような場合にいくつかの手がかりが得られるかもしれません.

于 2013-01-09T11:51:19.153 に答える