Domanda C - Simboli indefiniti per architettura x86_64 durante la compilazione su Mac OSX Lion


Sto riscontrando alcuni problemi nella compilazione di un file name.c molto semplice 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 di 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 puoi vedere, richiede questa libreria: https://manual.cs50.net/CS50_Library.

Ora, quando lo compilo, succede questo:

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 funzione GetString () cs50.c all'interno del 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é 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.


12
2017-08-24 13:19


origine


risposte:


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

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

g++ file.cpp -lcs50

Il tuo secondo codice di esempio non si collega, perché manualmente (e esplicitamente) fornisce un'implementazione per GetString, anche se vuoto.


17
2017-08-24 14:44