從網路上找資訊, 最怕的就是找到舊的或錯誤的東西
今兒個找了個範例, 結果遇到無法編譯的問題, 就是因為用的是舊方法
問題主要出在 #include <linux/ip.h> 然後就跳出一堆錯誤:
1 2 3 4 5 6 7 8 9 |
; html-script: false ]/usr/include/linux/byteorder/little_endian.h:43: error: '__le64' does not name a type /usr/include/linux/byteorder/little_endian.h:47: error: expected ',' or '...' before '*' token /usr/include/linux/byteorder/little_endian.h: In function '__u64 __le64_to_cpup(int)': /usr/include/linux/byteorder/little_endian.h:49: error: 'p' was not declared in this scope /usr/include/linux/byteorder/little_endian.h: At global scope: /usr/include/linux/byteorder/little_endian.h:67: error: '__be64' does not name a type /usr/include/linux/byteorder/little_endian.h:71: error: expected ',' or '...' before '*' token /usr/include/linux/byteorder/little_endian.h: In function '__u64 __be64_to_cpup(int)': /usr/include/linux/byteorder/little_endian.h:73: error: 'p' was not declared in this scope |
拿這些訊息去 google 還查不出什麼來, 都是些老舊的文章
後來跑去翻自己以前寫的程式來比對, 才找到真正問題
原因是 linux/ 底下的東西本身是給 kernel 內部使用的
因此開發一般 userland 的程式不應該使用這些
較新的 linux 版本甚至把這些標頭檔也拿掉了
比較正確的作法, 是採用 netinet/ 底下的標頭檔
這是由 POSIX 所規範的標頭檔, 所以用這個開發出來也比較具有移植性
改成使用 netinet/ip.h 以後, 上面遇到的錯誤也就消失了