你好,我是编程世界的新手,我正试图在线学习哈佛大学的CS50课程。
在制作我的“Hello World”程序时,我下载了“cs50.h”以定义GetString
和string
(至少我认为)。所以这是我写的代码:
file.c:
#include "cs50.h"
#include <stdio.h>
int main(int argc, string argv[])
{
string name;
printf("Enter your name: ");
name = GetString();
printf("Hello, %s\n", name);
}
但是,每当我尝试make file
时,都会发生这种情况:
cc file.c -o file
Undefined symbols for architecture x86_64:
"_GetString", referenced from:
_main in file-JvqYUC.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: *** [file] Error 1
以下是cs50.h文件的链接,如果它可以提供帮助:http://dkui3cmikz357.cloudfront.net/library50/c/cs50-library-c-3.0/cs50.h
我想知道为什么我会收到此错误以及如何解决此错误。请帮忙。
答案 0 :(得分:5)
您似乎忘了从http://dkui3cmikz357.cloudfront.net/library50/c/cs50-library-c-3.0/cs50.c
下载并链接到项目cs50.c文件*。h通常只包含声明。 * .c(对于C)和* .cpp(对于C ++)包含实现。
此类中有GetSting函数实现:
string GetString(void)
{
// growable buffer for chars
string buffer = NULL;
// capacity of buffer
unsigned int capacity = 0;
// number of chars actually in buffer
unsigned int n = 0;
// character read or EOF
int c;
// iteratively get chars from standard input
while ((c = fgetc(stdin)) != '\n' && c != EOF)
{
// grow buffer if necessary
if (n + 1 > capacity)
{
// determine new capacity: start at 32 then double
if (capacity == 0)
capacity = 32;
else if (capacity <= (UINT_MAX / 2))
capacity *= 2;
else
{
free(buffer);
return NULL;
}
// extend buffer's capacity
string temp = realloc(buffer, capacity * sizeof(char));
if (temp == NULL)
{
free(buffer);
return NULL;
}
buffer = temp;
}
// append current character to buffer
buffer[n++] = c;
}
// return NULL if user provided no input
if (n == 0 && c == EOF)
return NULL;
// minimize buffer
string minimal = malloc((n + 1) * sizeof(char));
strncpy(minimal, buffer, n);
free(buffer);
// terminate string
minimal[n] = '\0';
// return string
return minimal;
}
答案 1 :(得分:0)
看看你的第一个包含声明。您正在使用“”而不是&lt; &GT;
答案 2 :(得分:0)
在使用CS50课程的视频中,教师使用插入符号(&lt;&gt;)而不是引号(&#34;&#34;)。
答案 3 :(得分:0)
对于参加CS50课程且不想每次都粘贴.c代码的人,您也可以在编译时链接CS50代码。
将cs50.h和cs50.c放在与file.c相同的目录中,然后在命令行中键入以下内容:
clang file.c -lcs50 -o <file name>
&#34; -l&#34;将cs50.c和cs50.h文件链接到您的c文件(在编译到目标文件之后)和&#34; -o&#34;指定编译输出的放置位置。
有关此here
的更多信息答案 4 :(得分:0)
在您的#include“ cs50.h”标头中,您应该像这样输入它:#include
#include<cs50.h>
#include<stdio.h>
int main(void)
{
string name = get_string("Enter your name: ");
printf("%s\n", name);
}
代替此:
#include "cs50.h"
#include <stdio.h>
int main(int argc, string argv[])
{
string name;
printf("Enter your name: ");
name = GetString();
printf("Hello, %s\n", name);
}
这应该消除错误消息。
P.S 在第2周,他们会向您介绍help50,但是如果您愿意,可以立即使用它。 我自己发现它非常有用。它是这样工作的:在终端窗口(执行./hello和clang的窗口)中,您应该输入:“ help50 make hello”(不带引号),然后它将输入:以黄色寻求帮助... 。然后它将破译错误消息并以更简单的语言将其键入。例如:
#include <stdio.h>
#include <cs50.h>
int main(void)
{
string name = get_string("Enter your name: ");
printf("%s\n", name)
}
我确实打招呼,并且出现:
clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow hello.c -lcrypt -lcs50 -lm -o hello
hello.c:13:21: error: expected ';' after expression
printf("%s\n", name)
^
;
1 error generated.
<builtin>: recipe for target 'hello' failed
make: *** [hello] Error 1
但是当我使用help50做个问候时,会出现:
clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow hello.c -lcrypt -lcs50 -lm -o hello
hello.c:13:21: error: expected ';' after expression
printf("%s\n", name)
^
;
1 error generated.
<builtin>: recipe for target 'hello' failed
make: *** [hello] Error 1
Asking for help...
hello.c:13:21: error: expected ';' after expression
printf("%s\n", name)
^
;
Are you missing a semicolon at the end of line 13 of hello.c?
如您所见,现在我知道了我的问题并可以解决。 Help50将错误消息解密为您可以理解的语言。