2012-08-24 7 views
12

にコンパイルします。C - 建築x86_64のための未定義のシンボル私は、Mac OSXライオンに非常に非常に単純なname.cファイルをコンパイルする上でいくつかの問題を取得していますマックOSXライオン

今、私は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とlibcs​​50.aの両方がそれぞれ/ usr/local/includeと/ usr/local/libにあることを確認しました。

ご協力いただきありがとうございます。

+1

コンパイラに '-lcs50'を渡していますか? – apmasell

+0

また、適切な '-L 'は '-lcs50'をどこで検索するのかコンパイラに伝えますか? – twalberg

答えて

17

あなたが遭遇する問題は、リンク段階であり、コンパイルされていません。 GetStringの実装は提供されておらず、その宣言(.hファイル#includeを介して)だけです。

実装自体を提供するには、通常、それを含むライブラリにリンクする必要があります。これは通常-lフラグによってg++に行われます。手動で(明示的)GetStringのための実装を提供するため、例えば、

g++ file.cpp -lcs50 

あなたの第二のサンプルコードは、空の1が、リンクを行います。

+1

ありがとう、申し訳ありませんが、私は(間違って)コンパイラがどこを探しているかを知っていました。 今、私はリンクにもっと注意を払うでしょう。 もう一度ありがとうございます! – Pillo

関連する問題