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

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

Теперь я начал следовать курсу Harvard 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.

Спасибо заранее за вашу помощь.


person Pillo    schedule 24.08.2012    source источник
comment
Вы передаете -lcs50 своему компилятору?   -  person apmasell    schedule 24.08.2012
comment
А также соответствующий -L<some_directory>, чтобы указать компилятору, где искать -lcs50?   -  person twalberg    schedule 24.08.2012


Ответы (1)


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

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

g++ file.cpp -lcs50

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

person user1071136    schedule 24.08.2012
comment
Большое спасибо, извините, но я (ошибочно) думал, что компилятор знает, где искать. Теперь я уделю больше внимания связыванию. Еще раз спасибо! - person Pillo; 26.08.2012