C – 在Mac OSX Lion上编译时架构x86_64的未定义符号

在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,name);
 }

string
GetString(void)
{
    // CODE
}

为什么会发生这种情况?
我在上面的链接上安装了图书馆;我查了两个cs50.h和libcs​​50.a分别在/usr/local / include和/usr/local / lib.

预先感谢您的帮助.

解决方法

遇到的问题是在连接阶段,而不是编译.你没有提供GetString的实现,只是它的声明(通过#include的.h文件).

为了提供实现本身,你通常需要链接到包含它的库;这通常由-l标志来完成.例如,

g++ file.cpp -lcs50

您的第二个示例代码链接,因为您手动(并显式地)为GetString提供了一个空的实现.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...