2017-10-08 47 views
0

我开始进入c编程,并在cs50平台上进行了一系列讲座,由于我的互联网出现了一些问题,我决定下载这个库以便我可以在离线时下载问题集时有意义,下载后该库,并包含在项目中make命令不会在所有的工作给我这个输出cc(文件名).c -l(库的名称)-o(输出文件名)做什么以及为什么make make does not work?

cc main.c -o main /tmp/ccz5QZev.o: In function main': main.c:(.text+0x18): undefined reference to get_string' collect2: error: ld returned 1 exit status : recipe for target 'main' failed make: *** [main] Error 1

get_string是对的#include定义的“libcs​​50 - 开发/ src目录/ cs50.h”,有人告诉我运行“cc main.c -lcs50 -o main”而不是“make”会解决这个问题,这个建议确实起作用,但我无法再与这个人联系来找出原因。有人可以向我解释发生了什么吗?

+0

您的'get_string'函数可能在cs50.h中声明为*,但它不是* defined *,否则您不会遇到您描述的错误。也就是说,头文件不包含函数的实现,无论是源代码还是二进制形式。显然,一个实现被包含在一个名为libcs​​50的库中,您的系统知道; '-lcs50'编译参数说从那里获得实现。标题名称与库名称之间的关系仅仅是约定,绝不是通用的。 –

回答

1

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

你所得到的错误是当链接器attemping在头部声明绑定符号cs50.h

必须有一个库文件,该文件也需要包含在编译链接步骤。

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

这通常表示进一步切换到链接程序,以告知链接程序库位于哪里。

对于gcc编译器,指出要使用-L开关搜索库的目录。 (see options)

+1

'cs50.h'是一个标题,而不是一个库。您在源文件中包含标题。您在链接命令行上包含库。他们完全不同。一种是纯文本和人类可读的;另一个是目标代码,只有机器可读。当然,头文件和库相关,因为有一个或多个C源文件(通常是)实现由头文件声明的函数,并且这些源文件被编译为目标代码,并从结果中创建一个库。 –

+0

谢谢。我同意,cs50.h确实是一个标题,而不是一个库。固定 – user308879