2012-08-24 23 views
12

Mam problemy z kompilowaniem bardzo prostego pliku name.c na Mac OSX Lion.C - Niezdefiniowane symbole dla architektury x86_64 podczas kompilacji na Mac OSX Lion

Teraz zacząłem śledzić kurs Harvard CS50 na cs50.net. Nie jestem całkowicie nowy w programowaniu, ale byłem ciekawy, jak ten kurs został nauczony.

Jest źródłem nazwa.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; 
} 

Jak widać, to wymaga tej biblioteki: https://manual.cs50.net/CS50_Library.

Teraz, kiedy go skompilować, to się dzieje:

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 

Jeśli mogę użyć tego samego getString() function cs50.c w moim pliku źródłowego, to działa doskonale:

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

Dlaczego czy to się stało? Zainstalowałem bibliotekę tak, jak jest napisane na powyższym łączu; Sprawdziłem i oba cs50.h i libcs50.a są odpowiednio w/usr/local/include i/usr/local/lib.

Z góry dziękujemy za pomoc.

+1

Czy przekazujesz '-lcs50' do kompilatora? – apmasell

+0

A także odpowiednie '-L ', aby powiedzieć kompilatorowi, gdzie szukać '-lcs50'? – twalberg

Odpowiedz

17

Problem, który napotkasz na etapie łączenia, nie kompiluje. Nie dostarczyłeś implementacji GetString, tylko jej deklarację (poprzez plik .h jesteś #include).

Aby zapewnić samą implementację, zwykle trzeba połączyć się z biblioteką, która ją zawiera; zazwyczaj jest to wykonywane przez flagę -l na g++. Na przykład,

g++ file.cpp -lcs50 

Twój drugi przykładowy kod robi odnośnik, bo ręcznie (i jawnie) zapewnić implementację dla GetString, choć pustej jeden.

+1

Dziękuję bardzo, przepraszam, ale ja (błędnie) myślę, że kompilator wiedział, gdzie szukać. Teraz będę zwracać większą uwagę na łączenie. Jeszcze raz dziękuję! – Pillo

Powiązane problemy