2012-08-24 11 views
12

Ho riscontrato alcuni problemi nella compilazione di un file name.c molto semplice su Mac OSX Lion.C - Simboli indefiniti per architettura x86_64 durante la compilazione su Mac OSX Lion

Ora, ho iniziato a seguire il corso Harvard CS50 su cs50.net. Non sono totalmente nuovo alla programmazione, ma ero curioso di sapere come questo corso è stato insegnato.

Questa è la fonte della 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; 
} 

Come si può vedere, si richiede questa libreria: https://manual.cs50.net/CS50_Library.

Ora, quando compilo esso, questo accade:

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 

Se uso la stessa GetString() funzione cs50.c dentro il mio file sorgente, funziona perfettamente:

#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 
} 

Perché questo succede? Ho installato la libreria come si dice sul link sopra; Ho controllato e sia cs50.h che libcs50.a sono rispettivamente in/usr/local/include e/usr/local/lib.

Grazie in anticipo per il vostro aiuto.

+1

Passate '-lcs50' al compilatore? – apmasell

+0

E anche un appropriato '-L ' per dire al compilatore dove cercare '-lcs50'? – twalberg

risposta

17

Il problema riscontrato è nella fase di collegamento, non in fase di compilazione. Non hai fornito l'implementazione di GetString, solo la sua dichiarazione (tramite il file .h#include).

Per fornire l'implementazione stessa, di solito è necessario collegarsi alla libreria che lo include; questo di solito viene fatto dal flag -l a g++. Ad esempio,

g++ file.cpp -lcs50 

Il codice secondo campione fa collegamento, perché si manualmente (ed esplicitamente) fornire un'implementazione per GetString, anche se uno vuoto.

+1

Grazie mille, scusa ma ho pensato (erroneamente) che il compilatore sapesse dove cercare. Dopodiché, presterò maggiore attenzione al collegamento. Grazie ancora! – Pillo

Problemi correlati