0

他の人のC++コードをコンパイルしようとしています。私自身、C++の経験はありません。MACでg++を使用して、受け取った.cppファイルの1つをコンパイルしています。するとg++ main.cpp、未定義のシンボルエラーが発生します。グーグルで答えるのはファイル間のリンクが間違っているようですが、ファイルをリンクする方法がわかりません。ファイルをコンパイルするにはどうすればよいですか?以下に完全なコードを貼り付けました。

Undefined symbols:
  "initializeFitness()", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Grid::GetNeighbourhood(int, int, std::vector<Agent**, std::allocator<Agent**> >&)", referenced from:
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
  "Grid::Grid()", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Reaper::GetAgentToKill()", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Cupid::GetRandomBreeder()", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Reaper::Select()", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Grid::~Grid()", referenced from:
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
  "Breeder::Breed(Agent**, Agent**)", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Cupid::Select()", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Cupid::GetEmptyCell()", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Agent::GetType()", referenced from:
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
  "Breeder::ProcessNeighbourhood(std::vector<Agent**, std::allocator<Agent**> > const&)", referenced from:
      runEvolution()     in ccZXBTDH.o
  "FateAgent::GetGenome(double*)", referenced from:
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
  "Cupid::GetParents()", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Agent::IncreaseAge()", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Grid::GetAgent(int, int)", referenced from:
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
  "FateAgent::GetSelectedCount()", referenced from:
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
  "Breeder::GetGenome(double*)", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Agent::GetFitness()", referenced from:
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
      runEvolution()     in ccZXBTDH.o
  "Agent::~Agent()", referenced from:
      runEvolution()     in ccZXBTDH.o
  "Grid::DoMovement()", referenced from:
      runEvolution()     in ccZXBTDH.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
4

5 に答える 5

5

プログラム全体の一部だけをコンパイルしようとしていると思います。それでもg++ *.cpp
うまくいかない場合は、プログラムに外部ライブラリが必要な可能性があります。

于 2012-10-05T15:11:24.923 に答える
4

g ++ は、状況をさらに知ることなく、一連のシンボルを見つけることができません。リンクする前に、すべてのソース コード ファイルをコンパイルしていないと思います。

もう少し背景:

g++ を 1 つのソース ファイル引数だけで呼び出すと、ファイルがコンパイルされ、それを完全な実行可能ファイルにリンクしようとします。

-c フラグを使用して各ソース ファイルをコンパイルすることをお勧めします (-c フラグは、ファイルをオブジェクト コードにコンパイルするが、実行可能ファイルにリンクしないようにコンパイラに指示します)。

g++ -c main.cpp
g++ -c file1.cpp
g++ -c file2.cpp

上記のコマンドは、.cpp を .o に置き換えたオブジェクト ファイルを作成します。次に、次のようなことを行うことで、それらをすべてリンクできます

g++ main.o file1.o file2.o

これにより、実行可能な a.out が生成されます。これは、シンボル リンカの欠落エラーを解決するのに役立ちます。

これよりも複雑なことを行う場合は、Makefile を使用してコードをビルドする方法を調査することを強くお勧めします。

于 2012-10-05T15:13:29.057 に答える
2

ここは推測するしかありません。プロジェクトにはいくつのファイルがありますか? ライブラリはありますか?

ライブラリがある場合は、それらを -l スイッチでリンクする必要があります

g++ -o output_binary_name source_file -lLibrary1 -lLibrary2

または、プロジェクトに複数のソース ファイルがある場合は、それらを列挙する必要があります。

g++ -o output_binary_name source_file1 source_file2 source_file2
于 2012-10-05T15:13:01.133 に答える
1

それはコードではないと思います。デバッグ出力だと思います。

runEvolution() は、まだ定義されていない関数を使用します。それらの定義を探してください。

多くの人が示唆したように、いくつかのファイルが欠落している可能性があります.gccは明らかにコード内の何かを見逃しています.

幸運を!

于 2012-10-05T15:10:13.317 に答える
1

プログラムがライブラリを使用していないと仮定すると、すべてのファイルを-cswitch でコンパイルしてから、それらを次のようにリンクする必要があります。

g++ -c main.cpp
g++ -c file1.cpp
..
g++ *.o

または、次のように自動的に同じことを行うことができます:

g++ *.cpp
于 2012-10-05T15:13:36.957 に答える