2

近づいていると思いますが、このエラーが発生しています。何時間も壁に頭をぶつけていました。ばかげた何かが欠けていて、文字ごとに行ったのですが、見つかりません。

コンパイラは私に与えています

main.cpp:16: undefined reference to `translator::translator(std::istream&)'
collect2: error: ld returned 1 exit status

プログラムをコンパイルしようとすると。コンパイルに使用しているコマンドは次のとおりです。

clear && g++ -g -Wall main.cpp -o Pear

利用シーンは以下の3つです。

main.cpp

int main(int argc, char* argv[])
{

std::ifstream myFile;

myFile.open(argv[1]);

translator example(myFile); 

myFile.close(); 

return 0; 
}

翻訳者.cpp

#include <fstream>
#include <iostream>
#include <string>

#include "translator.h"


translator::translator(std::istream& in)
{   
table1(in);
table2(in);
}

翻訳者.h

#ifndef TRANSLATOR
#define TRANSLATOR

#include <fstream>
#include <iostream>
#include <string>

#include "translationTable.h"


class translator
{
private:

translationTable<std::string, int> table1;

translationTable<int, std::string> table2;

translator(); 

public:

translator(std::istream& in); 

};



#endif

何か案は?私は多くのことを試し、同様の問題を調べましたが、それらはすべて異なるソースを持っています. 前もって感謝します!

4

2 に答える 2

7

のコマンド ラインにg++は、次のように両方のソース ファイルを含める必要があります。

g++ -g -Wall main.cpp translator.cpp -o Pear

translator::translator(std::istream&)それ以外の場合、コンパイラはメンバー関数の実装をどこから取得するかわかりません。

*編集:*(コメントから)

基本的にヘッダーファイルの使用は、ファイルの各実装をどこで取得するかを知るためだと思いましたか?

この部分は非常に単純化されていますが、全体像を把握するのに役立ちます。C++ ソースから実行可能ファイルを作成するプロセスは、コンパイルとリンクという 2 つの主要なステップで構成されていることを思い出してください。g++プログラムはそれらの両方を実行します (フラグを指定するか、ファイルのみを渡すと、一方だけを実行できます-c) .o

のコンパイラとリンカーの段階は、g++互いに直接「対話」しません。コンパイラはリンカーへの入力を生成し、そこで通信が終了します。

ヘッダー ファイルはコンパイラ用です。具体的には、コンパイルの最初の段階である前処理用です。プリプロセッサが終了すると、定義がどこから来たのかはわかりません。リンカーは言うまでもなく、コンパイラでさえそれを知りません。そのため、関連するすべてのソースを に提供して、リンカーを「支援」する必要がありますg++

于 2013-02-10T23:21:39.710 に答える
2

translator.o をアプリケーションにリンクしていません。

g++ -g -c translator.cpp

に続く

g++ -g -Wall main.cpp translator.o -o Pear
于 2013-02-10T23:22:04.867 に答える