dpdk 庫源碼中包含 linux/version.h的問題

問題描述

dpdk-16.04 中的 eal_vfio.h 頭文件中有下面的預處理語句:

#ifdef RTE_EAL_VFIO
#include <linux/version.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0)
#include <linux/vfio.h>

在不同的環境上編譯時發現生成的代碼不同。研究了下發現是上面預處理語句中 LINUX_VERSION_CODE判斷的問題。

分析驗證

驗證不同環境上 RTE_KERNEL指定的內核目錄下的 linux/version.h頭文件,發現是相同的。

真正的問題

一開始沒有想到頭文件搜索路徑的問題,最後終於發現庫函數中 linux/version.h並不是從 RTE_KERNEL指定的內核源碼路徑中搜索的,而是從編譯機器上的 ```/usr/include/linux`` 目錄搜索的。

對比不同環境上的 /usr/include/linux/version.h,果然發現了一個機器上的 version.h版本不對。

這裏的注意事項如下:

  1. 編譯 dpdk 內核相關 ko 的源文件時 linux/version.h 是從指定的內核路徑下面搜索
  2. 編譯庫函數時包含的 linux/version.h 頭文件是從編譯系統上的 /usr/include/linux 目錄中搜索的
  3. 不同機器上的 /usr/include/linux 路徑中的 version.h 可能存在差別
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章