Il linker GCC non trova la libreria standard?

Ho sviluppato un progetto scolastico in XCode. Il prodotto finale deve essere inviato in codice sorgente con un makefile, quindi ho scritto un makefile e ho iniziato a compilarlo in questo modo, per assicurarmi di avere una copia funzionante. Ecco il mio makefile:

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 

La compilazione di ciascuno dei file object funziona correttamente, ma quando arriva a “tutto”, il passaggio di collegamento, sembra non essere a conoscenza della libreria standard. Ricevo l’errore “simboli non definiti” per tutto da “cin”, a “basic_string”, a “operator new”.

Avevo l’impressione che queste cose non avessero bisogno di essere indicate direttamente, e in effetti non avevano bisogno di farlo in passato.

Qualche idea su cosa potrebbe accadere?

MODIFICARE:

Se aiuta, ecco l’inizio del (molto lungo) messaggio di errore:

 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 >& std::operator<< <char, std::char_traits, std::allocator >(std::basic_ostream<char, std::char_traits >&, std::basic_string<char, std::char_traits, std::allocator > 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 >*, std::list<Farm*, std::allocator >*&)in world.o 

Per colbind il codice C ++, è necessario utilizzare il comando g++ , non il comando gcc .

Durante la compilazione, il comando gcc sa che sta compilando il codice C ++ a causa del suffisso .cpp (ma è comunque una buona idea usare il comando g++ ).

Durante il collegamento, il comando gcc vede solo un mucchio di file .o . Il comando g++ differisce dal comando gcc in quanto sa dove trovare le librerie specifiche di C ++.

(Il fatto che il nome gcc riferisca sia al comando, che di solito è usato per compilare il codice C, sia alla “Collezione del compilatore GNU” nel suo insieme, può essere un po ‘di confusione).

Devi usare g++ per compilare e colbind il codice sorgente C ++, non gcc .

Inoltre, puoi escludere tutti i bersagli oltre al primo e all’ultimo. make sa come compilare i file .cpp in .o già – non devi dirgli come.

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

Cosa in questa riga di comando pensi che dice a gcc di collegarsi alla libreria standard C ++? Non ci sono file C ++ collegati. Non hai specificato una lingua. E invochi il compilatore come gcc .