¿El enlazador de GCC no puede encontrar la biblioteca estándar?

He estado desarrollando un proyecto escolar en XCode. El producto final debe enviarse en el código fuente con un archivo MAKE, así que escribí un archivo MAKE y comencé a comstackr de esa manera, para asegurarme de tener una copia de trabajo. Aquí está mi archivo MAKE:

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 comstackción de cada uno de los archivos de objeto funciona bien, pero cuando llega a “todo”, el paso de enlace, parece no tener conocimiento de la biblioteca estándar. Obtengo un error de “símbolos indefinidos” para todo, desde “cin”, “basic_string”, hasta “operator new”.

Tenía la impresión de que estas cosas no necesitaban ser indicadas directamente, y de hecho no han sido necesarias en el pasado.

¿Alguna idea de lo que podría estar pasando?

EDITAR:

Si es útil, aquí está el comienzo del mensaje de error (muy largo):

 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 

Para vincular el código C ++, debe usar el comando g++ , no el comando gcc .

Al comstackr, el comando gcc sabe que está comstackndo el código C ++ debido al sufijo .cpp (pero de todos modos es una buena idea usar el comando g++ ).

Al vincular, el comando gcc solo ve un grupo de archivos .o . El comando g++ difiere del comando gcc en que sabe dónde encontrar las bibliotecas específicas de C ++.

(El hecho de que el nombre gcc refiera tanto al comando, que generalmente se utiliza para comstackr el código C, como a la “Colección de comstackdores de GNU” como un todo, puede ser un poco confuso.)

Necesita usar g++ para comstackr y vincular el código fuente de C ++, no gcc .

Además, puedes omitir todos los objectives además de los primeros y los últimos. make sabe cómo comstackr archivos .cpp en .o ya – no tiene que decir cómo.

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

¿Qué cree que en esta línea de comandos le dice a gcc que enlace en la biblioteca estándar de C ++? No hay archivos C ++ vinculados. No has especificado un idioma. E invocar el comstackdor como gcc .