2012-01-18 23 views
4

私はXCodeで学校プロジェクトを開発してきました。最終製品はmakefileでソースコードで提出しなければならないので、私はmakefileを書いて、そのようにコンパイルを開始して、作業コピーがあることを確認してください。ここに私のメイクです:オブジェクトの各ファイルをコンパイルGCCリンカで標準ライブラリが見つかりませんか?

all: main.o StackList.o world.o Farm.o 
     gcc main.o StackList.o world.o Farm.o -g -o Project1 

main.o: 
     gcc -g -c main.cpp 

StackList.o: 
     gcc -g -c Stacklist.cpp 

world.cpp: 
     gcc -g -c world.cpp 

Farm.cpp: 
     gcc -g -c Farm.cpp 

clean: 
     rm *.o Project1 

が正常に動作しますが、それがになったときに「すべて、」リンクステップは、標準ライブラリを認識していないように見えます。私は、 "シン"から "basic_string"、 "オペレータnew"まで、すべての "未定義シンボル"エラーを取得します。

私は、これらのことを直接指摘する必要はなく、過去にそうする必要はなかったという印象を受けました。

何が起こっている可能性がありますか?

EDIT:

それが助け場合は、ここで(非常に長い)エラーメッセージのスタートだ:

Undefined symbols for architecture x86_64: 
    "std::cin", referenced from: 
    _main in main.o 
    "std::cout", referenced from: 
     _main in main.o 
     Farm::print(int) in Farm.o 
    "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from: 
     _main in main.o 
    "std::ios_base::Init::Init()", referenced from: 
     __static_initialization_and_destruction_0(int, int)in main.o 
     __static_initialization_and_destruction_0(int, int)in StackList.o 
     __static_initialization_and_destruction_0(int, int)in world.o 
     __static_initialization_and_destruction_0(int, int)in Farm.o 
    "std::ios_base::Init::~Init()", referenced from: 
     ___tcf_0 in main.o 
     ___tcf_0 in StackList.o 
     ___tcf_0 in world.o 
     ___tcf_0 in Farm.o 
    "operator new(unsigned long)", referenced from: 
     doStackSearch(std::basic_istream<char, std::char_traits<char> >*, std::list<Farm*, std::allocator<Farm*> >*&)in world.o 

答えて

19

C++コードをリンクするには、あなたがgccコマンド、g++コマンドを使用する必要はありません。コンパイルするとき

gccコマンドは、それが原因.cppサフィックスのC++コードをコンパイルしています(しかし、それはとにかくg++コマンドを使用することをお勧めします)ということを知っています。

リンクするとき、gccコマンドは.o個のファイルだけを表示します。 g++コマンドは、C++固有のライブラリの場所を知っている点でgccコマンドと異なります。

(名前gccは通常、Cのコードをコンパイルするために使用されるコマンドと、全体としては「GNUコンパイラコレクション」の両方を指すという事実は、少し混乱することができます。)

+0

申し訳ありませんが、愚かな質問のために、それは確かにそれを修正しました。 GCCとC++の両方が必要なときにお互いに電話をかけ、本質的に同じであると私の教授は教えてくれました。どうもありがとう! – xanderflood

1

あなたが必要gccではなく、g++を使用してC++ソースコードをコンパイルしてリンクします。

また、最初と最後のターゲット以外のすべてのターゲットを除外することもできます。 makeは既にのファイルを.oにコンパイルする方法を知っています。あなたはそれをどのように伝える必要はありません。

-2
gcc main.o StackList.o world.o Farm.o -g -o Project1 

このコマンドラインでは、gccにはC++標準ライブラリでリンクするように指示するものはありますか?リンクされているC++ファイルはありません。あなたは言語を指定していません。コンパイラをgccと呼びます。

関連する問題