web-dev-qa-db-ja.com

C-Mac OSX Lionでコンパイルすると、アーキテクチャx86_64の未定義のシンボル

Mac OSX Lionで非常に単純なname.cファイルをコンパイルすると、いくつか問題が発生します。

今、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にあります。

よろしくお願いします。

13
Pillo

発生する問題は、コンパイルではなくリンク段階にあります。 GetStringの実装を提供せず、その宣言のみを提供しました(.hファイルを使用して#include)。

実装自体を提供するには、通常、それを含むライブラリに対してリンクする必要があります。これは通常、-lフラグからg++へと行われます。例えば、

g++ file.cpp -lcs50

手動で(そして明示的に)GetStringの実装を提供するため、2番目のサンプルコードはリンクしますが、空の実装です。

19
user1071136