【问题标题】:What does cc (file name).c -l(library's name) -o (output file name) do and why does it work when make doesnt?cc (file name).c -l(library's name) -o (output file name) 有什么作用,为什么 make 不起作用时它会起作用?
【发布时间】:2017-10-11 02:12:47
【问题描述】:

我开始接触 c 编程,并在 cs50 平台上进行了一系列讲座,由于我的互联网存在一些问题,我认为下载库是有意义的,这样我就可以在离线时处理问题集,之后下载库并将其包含在项目中,make 命令根本不起作用,给我这个输出

cc main.c -o main /tmp/ccz5QZev.o:在函数main': main.c:(.text+0x18): undefined reference toget_string'collect2中: 错误:ld 返回 1 退出状态:目标“主”的配方 制作失败:*** [main] 错误 1

get_string 是在#include "libcs​​50-develop/src/cs50.h" 上定义的,有人告诉我运行 "cc main.c -lcs50 -o main" 而不是 "make" 可以解决问题,建议确实有效,但我无法再次联系该人以找出原因。有人可以向我解释发生了什么吗?

【问题讨论】:

  • 您的 get_string 函数可能在 cs50.h 中声明,但它没有在此处定义,否则您不会遇到错误描述。也就是说,标头不包含函数的实现,无论是源代码还是二进制形式。显然,您的系统知道一个名为 libcs​​50 的库中包含一个实现; -lcs50 编译器参数表示从那里获取实现。头文件名和库名的关系只是约定俗成的,绝非通用的。

标签: c import include cs50


【解决方案1】:

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

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

必须有一个库文件也需要包含在编译中。

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

这通常在进一步切换到链接器时指示,以告诉链接器库所在的位置。

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

【讨论】:

  • cs50.h 是标题,而不是库。您在源文件中包含标题。您在链接命令行中包含库。它们完全不同。一种是纯文本和人类可读的;另一个是目标代码,只有机器可读。当然,头文件和库是相关的,因为(通常)有一个或多个 C 源文件(通常)实现了头文件声明的函数,这些源文件被编译为目标代码,并根据结果创建一个库。
  • 谢谢。我同意,cs50.h 确实是一个标题,而不是一个库。固定
猜你喜欢
  • 2019-04-04
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
相关资源
最近更新 更多