2012-08-24 12 views
12

Tengo algunos problemas para compilar un archivo name.c muy simple en Mac OSX Lion.C - Símbolos indefinidos para la arquitectura x86_64 al compilar en Mac OSX Lion

Ahora, empecé a seguir Harvard CS50 curso en cs50.net. No soy totalmente nuevo en programación, pero tenía curiosidad sobre cómo se ha impartido este curso.

Esta es la fuente de name.c:

#include <stdio.h> 
#include <cs50.h> 

int 
main(void) 
{ 
    printf("State your name:\n"); 
    string name = GetString(); 
    printf("O hai, %s!\n", name); 
    return 0; 
} 

Como se puede ver, se requiere de esta biblioteca: https://manual.cs50.net/CS50_Library.

Ahora, cuando compilo, esto sucede:

Undefined symbols for architecture x86_64: 
    "_GetString", referenced from: 
     _main in name-vAxcar.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [name] Error 1 

Si utilizo la misma función GetString cs50.c() dentro de mi archivo de origen, funciona perfectamente:

#include <stdio.h> 
#include <string.h> 
#include <float.h> 
#include <limits.h> 
#include <stdbool.h> 
#include <stdlib.h> 

typedef char *string; 

string GetString(void); 

int 
main(void) 
{ 
    printf("State your name:\n"); 
    string name = GetString(); 
    printf("O hai, %s!\n", name); 
} 

string 
GetString(void) 
{ 
    // CODE 
} 

Por qué sucede esto? Instalé la biblioteca como dice en el enlace de arriba; Revisé y tanto cs50.h como libcs50.a están respectivamente en/usr/local/include y/usr/local/lib.

Gracias de antemano por su ayuda.

+1

¿Está pasando '-lcs50' a su compilador? – apmasell

+0

Y también un apropiado '-L ' para decirle al compilador dónde buscar '-lcs50'? – twalberg

Respuesta

17

El problema con el que se encuentra es en la etapa de vinculación, no compilando. No proporcionó la implementación de GetString, solo su declaración (a través del archivo .h, #include).

Para proporcionar la implementación en sí, por lo general necesita vincularse con la biblioteca que lo incluye; esto generalmente se hace mediante el indicador -l al g++. Por ejemplo,

g++ file.cpp -lcs50 

Su segundo ejemplo hace de enlace, ya que de forma manual (y explícitamente) proporciona una implementación para GetString, aunque uno vacío.

+1

Muchas gracias, lo siento pero (erróneamente) pensé que el compilador sabía dónde buscar. Ahora, voy a prestar más atención a los enlaces. ¡Gracias de nuevo! – Pillo

Cuestiones relacionadas