cc(文件名).c-l(库名)-o(输出文件名)是做什么的,为什么make不起作用?

cc(文件名).c-l(库名)-o(输出文件名)是做什么的,为什么make不起作用?,c,import,include,cs50,C,Import,Include,Cs50,我开始学习c编程,并在cs50平台上学习了一系列课程,由于我的互联网出现了一些问题,我决定下载这个库,这样我就可以在脱机时处理问题集了,在下载库并将其包含在项目中之后,make命令根本不起作用,无法为我提供此输出 cc main.c-o main/tmp/ccz5QZev.o:In functionmain': main.c:(.text+0x18):对get_string'collect2的未定义引用: 错误:ld返回1退出状态:目标“main”的配方 制作失败:**[main]错误1 get

我开始学习c编程,并在cs50平台上学习了一系列课程,由于我的互联网出现了一些问题,我决定下载这个库,这样我就可以在脱机时处理问题集了,在下载库并将其包含在项目中之后,make命令根本不起作用,无法为我提供此输出

cc main.c-o main/tmp/ccz5QZev.o:In function
main':
main.c:(.text+0x18):对
get_string'collect2的未定义引用: 错误:ld返回1退出状态:目标“main”的配方 制作失败:**[main]错误1


get_字符串是在#include“libcs50 develope/src/cs50.h”上定义的,有人告诉我,运行“cc main.c-lcs50-o main”而不是“make”可以解决问题,该建议确实有效,但我无法再次联系此人以了解原因。有人能告诉我发生了什么吗?

您的调用执行两个步骤,编译和链接

您得到的错误来自链接器试图绑定头cs50.h中声明的符号时的链接步骤

编译中必须包含库文件

这似乎是你收到的建议,我同意。问题可能是链接器需要知道库“cs50”在路径中的位置

这通常在指向链接器的进一步开关中指示,以告知链接器库的位置


对于gcc编译器,使用-L开关指示要搜索库的目录

您的
get\u string
函数可以在cs50.h中声明,但它没有在那里定义,否则您就不会有您描述的错误。也就是说,头不包含函数的实现,无论是源代码形式还是二进制形式。显然,系统知道的libcs50库中包含了一个实现;
-lcs50
编译器参数表示从那里获取实现。标题名与库名之间的关系仅仅是约定,并不是通用的。
cs50.h
是标题,而不是库。您可以在源文件中包含标题。您可以在链接命令行中包含库。他们完全不同。一种是纯文本和可读性;另一种是目标代码,只有机器可读。当然,头和库是相关的,因为有一个或多个C源文件(通常)实现了头声明的函数,这些源文件被编译成目标代码,并根据结果创建了一个库。谢谢。我同意,cs50.h确实是一个标题,而不是一个库。固定的