解決隱式宣告與內建函式不相容問題終極“利器”
有時候,我們編譯程式碼時出現:
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 內嵌