2012-08-24 2 views
12

Mac OSX Lion에서 매우 간단한 name.c 파일을 컴파일하는 데 문제가 있습니다.C - Mac OSX Lion에서 컴파일 할 때 x86_64 아키텍처에 대한 정의되지 않은 기호

이제 저는 cs50.net에서 하버드 CS50 과정을 시작했습니다. 나는 완전히 프로그래밍에 익숙하지는 않지만이 과정이 어떻게 가르쳐 졌는지 궁금했다.

이 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; 
} 

,이 라이브러리가 필요합니다 : https://manual.cs50.net/CS50_Library. 나는 그것을 컴파일 할 때

이제

,이 상황이 발생합니다

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 

내 소스 파일 내에서 동일하여 GetString() cs50.c 기능을 사용하는 경우, 그것은 완벽하게 작동합니다 :

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

왜 이것이 일어날까요? 위의 링크에 표시된대로 라이브러리를 설치했습니다. 나는 cs50.h와 libcs50.a가 각각/usr/local/include와/usr/local/lib에 있는지 확인했다.

도움을 주셔서 감사합니다.

+1

'-lcs50'을 컴파일러에 전달하고 있습니까? – apmasell

+0

컴파일러에게'-lcs50'을 찾을 곳을 알려주는 적절한'-L '? – twalberg

답변

17

발생하는 문제는 컴파일 단계가 아니라 연결 단계입니다. GetString의 구현을 제공하지 않았으며 그 선언은 .h 파일 #include을 통해 제공했습니다.

구현 자체를 제공하려면 일반적으로이를 포함하는 라이브러리에 링크해야합니다. 이는 일반적으로 -l 플래그가 g++ 인 플래그에 의해 수행됩니다. 수동 (명시 적) GetString에 대한 구현을 제공하기 때문에 예를 들어,

g++ file.cpp -lcs50 

두 번째 샘플 코드는 비어있는 불구하고, 링크를 않습니다.

+1

정말 고마워요, 미안하지만 컴파일러가 어디서 찾을 지 알았습니다. 이제 연결에 대해 더 많은 관심을 기울일 것입니다. 다시 한 번 감사드립니다. – Pillo

관련 문제