【问题标题】:implicit declaration of function 'get_string' [closed]函数'get_string'的隐式声明[关闭]
【发布时间】:2017-01-09 18:16:57
【问题描述】:

我收到以下错误

cc     string.c   -o string
string.c:7:16: warning: implicit declaration of function 'get_string' is invalid in C99
      [-Wimplicit-function-declaration]
        string name = get_string();
                      ^
string.c:7:9: warning: incompatible integer to pointer conversion initializing 'string' (aka 'char *')
      with an expression of type 'int' [-Wint-conversion]
        string name = get_string();
               ^      ~~~~~~~~~~~~
2 warnings generated.
ld: can't write output file: string for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [string] Error 1

当我尝试时

make string

string.c的代码:

  1 #include <stdio.h>
  2 #include <cs50.h>
  3 
  4 int main(void)
  5 {
  6         printf("Name: ");
  7         string name = get_string();
  8         printf("hello, %s\n", name);
  9 
 10 }

代码与第一周的课程相同。

请记住,我已经下载了 cs50.h 并按照 OSX 系统的 CS50 库手册中的说明进行了安装。

【问题讨论】:

  • 这是一个不同的版本,因为我刚刚在 CS_50.h 引用中找到了 string get_string(void);(名称与 cs50.h 略有不同)。错误的原因是因为在代码之前引用它的某处,您需要使用函数原型或函数定义(实现)声明get_string() 是什么。当不存在时,编译器过去常常对函数做出隐含的假设,但他们不再这样做了。
  • 需要在头部声明函数。也许声明和定义已经存在并且将被链接但编译器不知道这一点。添加字符串 get_string();到标题并查看链接器是否正确链接它以及它是否在没有定义的情况下执行。
  • 对不起,如果你很傻,你的意思是我必须编辑位于 /usr/local/include 的 CS50.h 吗? (我认为安装把它放在那里)
  • 编辑第三方库标题不太可能是正确的做法。通读头文件,看看是否能找到函数或类似函数,这样你就知道要使用什么函数了。
  • 属于 cs50.stackexchange.com

标签: c implicit cs50 getstring


【解决方案1】:

根据cs50 manual,函数名是GetString()而不是get_string()。因此,过时的 implicit the function declaration 开始生效(自 C99 以来无效),导致编译器假设 get_string() 返回 int。但是由于没有get_string() 的定义,最终链接会失败。

变化:

string name = get_string();

到:

string name = GetString();

【讨论】:

  • 照你说的做了,make string的结果是Undefined symbols for architecture x86_64: "_GetString",引用自:_main in string-cbacbf.o
  • 你可能没有正确安装cs50。请参阅:manual.cs50.net/library/#mac_os 错误表示链接器找不到函数GetString。这意味着您尚未编译 cs50.c 和/或将其链接到可执行文件中。
  • 我是否需要做一些超出手册所说的事情?我一步一步地做了两次,仍然得到同样的错误......这令人沮丧
  • @cl0wncl0wn:您的链接(编译)行是否包括-L /opt/cs50/lib 和-lcs50——您需要在其中指定安装CS50 库的目录(除非它可能位于@987654334 @ — 在这种情况下,您可以省略 -L /usr/local/lib),-lcs50 指示链接器查找 libcs50.so 或 libcs50.a(或等效名称;例如,macOS 上的 libcs50.dylib)。
  • 默认安装路径是cs50.h的/usr/local/include和libcs​​50.so的/usr/local/lib ----我玩过编译过程。最终我确实按照 lib 手册的指定手动运行了 cc string.c -o string -lcs50 它确实运行没有错误,但问题是当我执行字符串程序时,我得到了 Name: 作为输出,然后是 Segmentation Fault 11 似乎发生在使用 cs50.h 的那条线上,我实际上不知道那是什么
猜你喜欢
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 2022-01-16
  • 2011-10-05
  • 2013-10-28
相关资源
最近更新 更多