解决隐式声明与内建函数不兼容问题终极“利器”
有时候,我们编译代码时出现:gcc wserver.c -o wserverwserver.c: 在函数‘main’中:wserver.c:27:2: 警告:隐式声明与内建函数‘memset’不兼容 [默认启用] memset( &servaddr, '\0', sizeof(servaddr));这种情况多半是缺少某些头文件。那么如何确定缺少那些文件呢?Linux下查...
有时候,我们编译代码时出现:
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 内嵌
更多推荐
所有评论(0)