Intereting Posts

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

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

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

Это источник name.c:

#include  #include  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  #include  #include  #include  #include  #include  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 , хотя и пустую.