Подтвердить что ты не робот

C - Undefined символы для архитектуры x86_64 при компиляции на Mac OSX Lion

У меня возникают проблемы с компиляцией очень простого файла name.c на Mac OSX Lion.

Теперь я начал следовать курсу Гарварда CS50 на cs50.net. Я не совсем новичок в программировании, но мне было любопытно, как этот курс преподается.

Это источник 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.

Заранее благодарим вас за помощь.

4b9b3361

Ответ 1

Проблема, с которой вы сталкиваетесь, находится в стадии компоновки, а не компиляции. Вы не представили реализацию GetString, а только ее объявление (через .h файл #include).

Чтобы обеспечить реализацию, вам обычно нужно связать с библиотекой, которая включает ее; обычно это делается с помощью флага -l на g++. Например,

g++ file.cpp -lcs50

Второй код кода ссылается, потому что вы вручную (и явно) предоставляете реализацию для GetString, хотя и пустую.