有时候,我们编译代码时出现:

gcc wserver.c -o wserver
wserver.c: 在函数‘main’中:
wserver.c:27:2: 警告:隐式声明与内建函数‘memset’不兼容 [默认启用]
  memset( &servaddr, '\0', sizeof(servaddr));

这种情况多半是缺少某些头文件。那么如何确定缺少那些文件呢?

Linux下查找该函数位于哪个头文件:

下面正式介绍“利器”:

grep "memset" /usr/include/*.h

出来以下结果:
/usr/include/string.h:extern void *memset (void *__s, int __c, size_t __n) __THROW __nonnull ((1));
/usr/include/tiffio.h:extern void _TIFFmemset(void* p, int v, tmsize_t c);
/usr/include/wchar.h:extern wchar_t *wmemset (wchar_t *__s, wchar_t __c, size_t __n) __THROW;

于是我们根据查询的结果可以确定缺少的头文件为string.h

于是,源文件补上#include <string.h>就不再报错了。

 

下面推荐网上给出的常用检索命令:

1.find

Linux下最强大的搜索命令为”find“。它的格式为”find <指定目录> <指定条件> <指定动作>“;例如:

find / -name  'interfaces'   //使用find命令搜索在根目录下的所有interfaces文件所在位置

其他参数使用,请使用 man find 获取帮助(小技巧:按下ctrl+f 可快进一页查看,ctrl+b 回退一页)。

2. grep

print lines matching a pattern,输出匹配的检索结果。

如:

grep "memset" /usr/include/*.h   // 使用grep命令过滤出/usr/include/目录下所有后缀名为.h的头文件含有memset的文件所在行。

系统通用的规则有

*     匹配所有

?  匹配一个字符。

[ab]  匹配a或者b

[!a]   匹配非a

[a-z]  匹配符合a-z的字符

例如:

grep "m*set" /usr/include/*.h

发现结果很多,一直滚屏。

检索结果带分屏显示:

grep "m*set" /usr/include/*.h   | more

小技巧:按 f 键前进一屏,按下 enter 前进一行,按下  q 退出分屏显示。

不会回退显示? 这么强大的Linux怎么可能做不到?!

grep  "m*set"  /usr/include/*.h  |  less

小技巧:按 f 键前进一屏,按下 b 回退一屏,d 键前进半屏,u 回退半屏  ,按下 enter或者e 前进一行 ,y 键回退一行,g文件第一行  G文件最后一行, 按下  q 退出分屏显示。

再如:  grep "accept" /usr/include/*/*.h 

3.which

命令查看系统命令是否存在,并返回系统命令所在的位置。

shows the full path of (shell) commands.

例如:

which cd

/usr/bin/cd

 

4.whereis

命令可以搜索linux系统中的所有可执行文件即二进制文件。
locates the binary, source and manual files for the specified command names.

例如:

whereis -b cd  //查询二进制文件cd

cd: /usr/bin/cd

 

5.type

命令查看系统中的某个命令是否为系统自带的命令。

type cd

cd is a shell builtin   //cd 是 shell 内嵌

 

Logo

更多推荐