C語言常見錯誤與警告
C語言常見錯誤與警告C語言常見錯誤:
1 invalid type argument of ‘->’ (have ‘struct qstr_xid_element’)
這種錯誤一般是沒有理解C中“->”與“.”用法的不同,“->”是指向結構體指針獲取結構體的成員變量時所用,而“.”則是一般的結構體名獲取結構體的成員變量時所用。簡單來說,如果符號前是指針類型,那么用“->”,否則用“.”
2 make: *** /lib/modules/2.6.32-431.el6.x86_64/build/: No such file or directory.? Stop
原因:系統沒有安裝內核開發包,在上述所示的路徑中查找build文件,發現沒有此文件或者文件鏈接失效,然后到/usr/src/kernels/中查看是否有對應的開發包
解決辦法:1 yum install kernel-devel-$(uname -r)
2 如果找不到yum源,那么可以直接從網上下載對應的內核開發包,放入/usr/src/kernels/中,并rpm -i kernel-devel-xxx.rpm。如果內核版本不同,需要重新做一個鏈接,首先刪除錯誤鏈接:rm build;然后查看當前內核版本:uname -r;新建一個鏈接:ln -s /usr/src/kernels/3.10.0-327.2.e17.x86_64/build
3 Error downloading packages:
解決辦法:執行yum clean all 清除緩存目錄下的軟件包及舊的headers;然后重新yum install
參考:http://wenzhongxiang.blog..com/6370734/1434577 點擊打開鏈接
4 您可以嘗試添加 –skip-broken 選項來解決該問題
** 發現 19 個已存在的 RPM 數據庫問題, ‘yum check’ 輸出如下
解決辦法:1 package-cleanup --cleandupes
2 yum install XXX
如果發現需要安裝的包的版本低于安裝的版本:yum makecache
5 如果出現 致命錯誤:scsi/sg.h:沒有那個文件或目錄
此文件是Linux內核中的頭文件,在/usr/include中的對應路徑下確實沒有找到此文件,但是在/usr/src/kernels/3.10.0-123.el7.x86_64/include的目錄下又找到了此文件
解決辦法:從/usr/src/kernels/3.10.0-123.el7.x86_64/include中將所需的文件拷到/usr/include中的對應路徑下,這里可能導致又會出現其他依賴的頭文件找不到,只能繼續拷貝了。也許有其他辦法,不過我只能找到這個笨辦法
參考:http://blog..net/ysdaniel/article/details/7043381點擊打開鏈接
此處可能會有幫助http://www.phpfans.net/ask/linux1/3585236355.html點擊打開鏈接
6 在gdb的工程中,調試時的代碼執行時亂序的
原因:這是由于代碼在編譯階段經過了編譯器的優化導致
解決辦法:關閉優化選項即可。只要將Makefile(或者執行命令)中的CFLAGS += -O(-O2 -O3)去掉即可
7 variable ‘XXX’ has initializer but incomplete type
原因:一般都是頭文件的問題,看看頭文件是否引用正確
在一個項目的MT測試過程中,我們需要通過gdb調試來確認代碼的正確性。然而在gdb調試過程中,我們發現程序在運行時內存實際的訪問順序與代碼的編寫順序并不一致(內存的亂序訪問),究其原因,是為了提高程序的運行效率。一般有兩種情況:
1 代碼在編譯階段經過編譯器的優化而導致內存亂序訪問(如使用優化選項O2或者O3編譯代碼)
為了解決此問題,Linux 內核提供函數 barrier() 用于讓編譯器保證其之前的內存訪問先于其之后的完成。
2 多 CPU 間交互引起內存亂序訪問,運行時,亂序處理器(Out-of-order processors)處理指令通常有以下幾步:
指令獲取
指令被分發到指令隊列
指令在指令隊列中等待,直到輸入操作對象可用(一旦輸入操作對象可用,指令就可以離開隊列,即便更早的指令未被執行)
指令被分配到適當的功能單元并執行
執行結果被放入隊列(而不立即寫入寄存器堆)
只有所有更早請求執行的指令的執行結果被寫入寄存器堆后,指令執行的結果才被寫入寄存器堆(執行結果重排序,讓執行看起來是有序的)
亂序執行相比有序執行能夠避免等待不可用的操作對象(有序執行的第二步)從而提高了效率。現代的機器上,處理器運行的速度比內存快很多,有序處理器花在等待可用數據的時間里已經可以處理大量指令了
8 do{...}while(0)的作用
作用1:定義宏,實現局部作用域。我們知道宏是簡單粗暴的替換,如果在if...else...的上下文中使用宏,而宏定義了多條語句,那么此宏的多條語句可能需要用{}括起來,根據不同情況可能需要加上或者不加分號(;),那么怎么統一呢,這時就用到do{...}while(0)
作用2:替代goto。我們是不倡導使用goto語句的,用do{...}while(0)在某些情況下是可以替代goto
9 collect2: error: ld returned 1 exit status
解決:這里我出現的原因是函數在聲明時沒有實現,即使是空實現{}也是要加上的
10 error: invalid storage class for function ‘XXX'
原因:我出現這種情況的原因是代碼中少了一個‘}’
11? error: too many arguments to function ‘pthread_create’
pthread_create(&tid,&attr,&func,(void)arg)只能傳遞一個參數給func,要是要傳一個以上的參數,請定義成結構體形式。
12? undefined reference to `pthread_create'
在linux上執行gcc thread.c,? 結果出現編譯錯誤undefined reference to 'pthread_create'。由于pthread庫不是標準linux庫, 所以出錯。 改為gcc thread.c -lpthread 即可。
13? 加載內核模塊的錯誤:insmod: ERROR: could not insert module xxx.ko: Unkown symbol in module
原因1:編譯的內核版本與運行的內核版本不一致導致的
解決辦法:KERNELDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
這樣編譯。
原因2:由于模塊依賴的其他模塊沒有加載導致的。
解決辦法1:dmesg | tail 看輸出信息中的Unknown symbol,加載上這些模塊。
2:modinfo? ./igb.ko | grep depend找模塊的依賴,如:depends: dca
然后執行? modprobe dca
insmod ./XXX.ko
參考:http://blog..net/wl_fln/article/details/9465341
14? 加載內核模塊的錯誤:insmod: ERROR: could not insert module xxx.ko:File exits
原因:說明已經加載過xxx.ko'啦? 不能重復加載
15? undefined reference to pthread_join
原因: pthread 庫不是 Linux 系統默認的庫,連接時需要使用靜態庫 libpthread.a
解決辦法:在編譯中要加 -lpthread參數。
16? GDB出現no debugging symbols found
原因:這是因為編譯時沒有加-g
解決辦法,如:
gcc test.c -o test -lpthread
改成
gcc test.c -o test -g -lpthread
17? static declaration follows non-static declaration
原因是調用的靜態函數沒有先聲明一下,就是它定義在你調用之后啦。
解決辦法:調用之前聲明一下這個函數。
18? 在struct fd_set fds時發生storage size of 'fds' isn't known
原因:fd_set是通過typedef重新聲明的新類型,所以fd_set就相當于struct fd_set
解決辦法:去掉struct,寫成:fd_set fds;
19? make: *** /lib/modules/2.6.32-573.7.1.el6.x86_64/build/: No such file or directory. Stop.
解決辦法:
1、安裝內核開發包
$ sudo yum install -y kernel-devel kernel-headers
如果上述執行后,發現安裝的內核開發包的版本與當前運行的內核版本不一致:
$ sudo yum install "kernel-devel-uname-r == $(uname -r)"
如果上述執行結果是:No package kernel-devel-uname-r == 3.12.6- 200.fc19.x86_64 available.Error: Nothing to do。那么
2、重新創建符號鏈接
$ ln -s /usr/src/kernels/2.6.32-573.7.1.el6.x86_64/ /lib/modules/2.6.32-431.el6.x86_64/build
$ ll /lib/modules/2.6.32-431.el6.x86_64/build
20 insmod:ERROR:could not insert module xxxx.ko:Invalid module format
原因:編譯的內核版本與運行的內核版本不一致導致的
21 -bash:ifconfig:command not found
原因1:查看path配置,如果沒發現/sbin,說明是path有問題
解決: 打開/etc/profile文件,在其中輸入export PATH=$PATH:/sbin
原因2:輸入:find / -name "ifconfig",如果什么也沒找到,表示CentOS更換指令了
解決:將"ifconfig"指令更改為"ip addr"
參考:https://www..com/dunitian/p/4974761.html
22 編譯內核,make menuconfig時出錯
/bin/sh: gcc: command not found
make[1]: *** [scripts/basic/fixdep] Error 127
...
原因:gcc編譯器未安裝
解決:yum install gcc*
接著make menuconfig可能還會出現錯誤:
HOSTCC? scripts/basic/fixdep
*** Unable to find the ncurses libraries or the
*** required header files.
*** 'make menuconfig' requires the ncurses libraries.
***
*** Install ncurses (ncurses-devel) and try again.
***
make[1]: *** [scripts/kconfig/dochecklxdialog] Error 1
make: *** [menuconfig] Error 2
解決:yum install ncurses*
參考:http://blog.sina.com.cn/s/blog_875c95f40101kae5.html
23 編譯內核,fatal error: openssl/aes.h: No such file or directory
原因:缺少OpenSSL開發包
解決:$ sudo yum install openssl-devel
參考:http://blog.163.com/rz_xiaojia/blog/static/11920919820163260234602/
24 lspci查看硬件信息時提示找不到命令:-bash: lspci: command not found
原因:沒有安裝pciutils包造成的。
解決:yun install pciutils
參考:http://blog.163.com/wangpeng922@126/blog/static/6413308320121112312058/
PS:同樣,如果 lsusb 時也提示找不到命令,那只要 #yum install usbutils就可以了
25 error: request for member ‘arg1’ in something not a structure or union
原因:. 與 -> 搞錯了
解決:如果它是地址,就在它后邊用 ->,如果它不是地址,就在它后邊就用 .
參考:https://www..com/annie-fun/p/6369872.html
26 test_rpc.py: error: invalid choice: 's' (choose from 'nvmeerror')
說明:表示說這個值(s)是無效的,要將s替換成nvmeerror
27 error: dereferencing pointer to incomplete type
原因:這個錯誤是指針指向的結構體類型沒有定義。
解決:1 沒有包含相應的頭文件的情況,包含對應頭文件就ok了。
2 自定義的結構體定義在.c文件中,在其他.c文件中使用該結構體指針時,也會出現類似錯誤。
28 error: invalid application of ‘sizeof’ to incomplete type
原因:對于不完整類型,sizeof都不能通過編譯
29 /build/lib/libspdk_bdev_nvme.a(blockdev_nvme_rpc.o):(.data+0x0): multiple definition of `req_timeout_ticks'
/build/lib/libspdk_bdev_nvme.a(blockdev_nvme.o):(.data+0x8): first defined here
原因:在頭文件中定義了變量或者函數,而非聲明。當此頭文件被不同的.c文件引用時,編譯生成相應的.o文件,鏈接的時候頭文件被重復引用嗎,會報重復定義
解決:在頭文件中只聲明函數、變量,而不定義。.h 文件中聲明函數/變量.c文件中定義函數/給變量賦值,變量面前最好加修飾符extern。
C語言常見警告:
1? warning: suggest parentheses around comparison in operand of ‘&’ [-Wparentheses]
該警告希望你在&(邏輯與)表達式左右加上括號。
2? warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [enabled by default]
該警告表示函數pthread_create的第三個參數不符合函數定義類型
ret = pthread_create(&thre_fd[i].tid, NULL, &err_detect, &arg);
void *err_detect(struct thr_arg *arg);
3? warning:ISO C90 forbids mixed declarations and code
ISO C90 禁止將聲明和代碼混合,就是說要先聲明,再使用
4? warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [enabled by default]
參數3加上void *。如:pthread_create(&thre_fd[i].tid, NULL, (void *)err_detect, &arg);
5? warning:incompatible implicit declaration of built-in function ‘malloc’ [enabled by default]
解決辦法:加入下面的頭文件
#include
#include
7? warning: "/*" within comment
原因是注釋符"/*"里又嵌套了"/*",把嵌套的注釋符去掉即可消除warning。
8 warning "implicit declaration of function ‘函數名’ "
這種錯誤一般是由于此函數所在的頭文件中未對函數進行聲明
9 warning: ‘gets’ is deprecated (declared at /usr/include/stdio.h:638)
http://blog..net/edwardandroid/article/details/38558545
2019-11-21 14:18