我在m a c 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文件you#include)。
为了提供实现本身,您通常需要链接到包含它的库;这通常是通过-l标记来完成的。例如,

g++ file.cpp -lcs50

您的第二个示例代码确实是链接的,因为您手动(显式)为g++提供了一个实现,尽管它是空的。

关于c - C-在Mac OSX Lion上编译时,体系结构x86_64的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12110184/

10-11 23:03