1

次のように定義されたヘッダーファイルが1つあります。

A.h
class A
{
  void f1();
  void f2();
};

A.cpp
  void A::f1(){}
  void A::f2(){}

今、このクラス関数を使用したい他のアプリケーション クラスを定義しているので、作成しました。

B.cpp
#include A.h

int main()
{
  A a1;
  a1.f1(); //linker error
}

しかし、この関数を呼び出すと、未解決の外部シンボルのようなリンク エラーが発生します。

4

2 に答える 2

3

まず第一に、エラーが「そのような」エラーだと言うのではなく、正確なエラーをコピーして貼り付ける必要があります。質問への回答に必要な重要な詳細を削除できる場合があります。

この特定のケースでは、ソリューションはかなり単純です。Visual C++ でプロジェクトを作成し、すべての .cpp ファイルをプロジェクトに追加する必要があります。コンパイルすると、リンカーは必要なものをすべて見つけることができるはずです。

于 2012-10-06T00:41:00.980 に答える
2

リンカー エラーとコンパイラ エラーは、まったく別のものです。#include ファイル内のこれらの関数宣言が行うことは、これらの関数を呼び出す方法をコンパイラに伝えることだけです。関数は別の場所で定義されています。コンパイラは、それらを呼び出す方法を知るために定義を知る必要はありません。これらのバラバラな部分をすべてまとめるのがlinkerの仕事です。必要な部分をリンカーに提供しないと、実行可能ファイルを取得できません。代わりにリンカー エラーが発生します。

A.cpp と B.cpp の両方をコンパイルしてから、これらをリンカーに提供する必要があります。コンパイラとリンカーが同じツールによって呼び出されることが多いからといって、それらが同じものであるとは限りません。そうではありません。彼らはかなり異なる仕事をしています。

于 2012-10-06T00:48:45.837 に答える