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とlibcs50.aの両方がそれぞれ/ usr/local/includeと/ usr/local/libにあります。
よろしくお願いします。
発生する問題は、コンパイルではなくリンク段階にあります。 GetString
の実装を提供せず、その宣言のみを提供しました(.h
ファイルを使用して#include
)。
実装自体を提供するには、通常、それを含むライブラリに対してリンクする必要があります。これは通常、-l
フラグからg++
へと行われます。例えば、
g++ file.cpp -lcs50
手動で(そして明示的に)GetString
の実装を提供するため、2番目のサンプルコードはリンクしますが、空の実装です。