C 函数的隐式声明';获取字符串';

C 函数的隐式声明';获取字符串';,c,implicit,cs50,getstring,C,Implicit,Cs50,Getstring,我得到以下错误 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: inc

我得到以下错误

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 }
1#包括
2#包括
3.
4内部干管(空)
5 {
6 printf(“名称:”);
7字符串名称=获取字符串();
8 printf(“你好,%s\n”,名称);
9
10 }
代码与第一周的课程相同

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

根据,函数名是
GetString()
而不是
get\u string()
。因此,过时的输入(从C99开始无效),导致编译器假定
get_string()
返回
int
。但是由于没有
get\u string()
的定义,链接最终会失败

更改:

string name = get_string();
致:

根据,函数名是
GetString()
而不是
get\u string()
。因此,过时的输入(从C99开始无效),导致编译器假定
get_string()
返回
int
。但是由于没有
get\u string()
的定义,链接最终会失败

更改:

string name = get_string();
致:



这是一个不同的版本,因为我刚刚发现
stringget\u字符串(void)
CS_50.h
参考中(名称与
cs50.h
略有不同)。出现错误的原因是,在代码被引用之前,您需要在函数原型或函数定义(实现)中声明
get\u string()
是什么。不存在时,编译器通常会对函数进行隐式假设,但现在不再这样做。您需要在标头中声明函数。可能声明和定义已经存在并将被链接,但编译器不知道这一点。添加字符串get_string();以查看链接器是否正确链接它,以及它是否在没有定义的情况下执行。抱歉,如果您太傻,您的意思是我必须编辑位于/usr/local/include中的CS50.h?(我认为是安装程序放在那里的)编辑第三方库标题不太可能是正确的做法。通读头文件,看看是否可以找到函数或类似的函数,以便知道要使用哪个函数。属于cs50.stackexchange.comIt是另一个版本,因为我刚刚找到
string get\u string(void)
CS_50.h
参考中(名称与
cs50.h
略有不同)。出现错误的原因是,在代码被引用之前,您需要在函数原型或函数定义(实现)中声明
get\u string()
是什么。不存在时,编译器通常会对函数进行隐式假设,但现在不再这样做。您需要在标头中声明函数。可能声明和定义已经存在并将被链接,但编译器不知道这一点。添加字符串get_string();以查看链接器是否正确链接它,以及它是否在没有定义的情况下执行。抱歉,如果您太傻,您的意思是我必须编辑位于/usr/local/include中的CS50.h?(我认为是安装程序放在那里的)编辑第三方库标题不太可能是正确的做法。通读头文件,看看是否可以找到该函数或类似函数,以便知道要使用的函数。如您所说,属于cs50.stackexchange.com,生成字符串的结果是架构x86的未定义符号。\u GetString“,引用自:_mainin string-cbacbf.o您可能没有正确安装cs50。请参阅:错误表明链接器找不到函数
GetString
。这意味着你还没有编译cs50.c和/或在你的可执行文件中链接它。我需要做一些比手册上说的更多的事情吗?我已经一步一步地做了两次,仍然得到同样的错误。。。那是frustrating@cl0wncl0wn:您的链接(编译)行是否包括
-L/opt/cs50/lib
-lcs50
-您需要在其中指定安装cs50库的目录(除非它位于
/usr/local/lib
-在这种情况下,您可以省略
-L/usr/local/lib
),和
-lcs50
指示链接器查找
libcs50.so
libcs50.a
(例如,在macOS上,或等效名称;
libcs50.dylib
)。默认安装路径是cs50.h的/usr/local/include和libcs50.h的/usr/local/lib。因此,我在编译过程中一直在玩。最终我手动运行了cc string.c-o string-lcs50,正如lib manual指定的,它运行时没有错误,但问题是,当我执行string程序时,我得到的名称是:as output,然后是Segmentation Fault 11,它似乎发生在使用cs50.h的那一行上。我实际上不知道这是怎么回事,正如你所说的,以及它的结果make string是架构x86_64的未定义符号:“_GetString”,引用自:string-cbacbf.o中的\u main。您可能尚未正确安装cs50。请参阅:错误表明链接器找不到函数
GetString
。这意味着你还没有编译cs50.c和/或在你的可执行文件中链接它。我需要做一些比手册上说的更多的事情吗?我已经一步一步地做了两次,仍然得到同样的错误。。。那是frustrating@cl0wncl0wn:您的链接(编译)行是否包括
-L/opt/cs50/lib
-lcs50
-您需要在其中指定安装cs50库的目录(除非它位于
/usr/local/lib
-在这种情况下,您可以省略
-L/usr/local/lib
),和
-lcs50
指示链接器查找
libcs50.so
libcs50.a
(或等效名称;
libcs50.dylib<