Linux

Linux Headers 中如何避免衝突?

  • November 25, 2020

我試圖了解 Linux 的工作原理以及如何建構模組。

到目前為止,我看到 Linux 標頭檔儲存在/usr/include其中,並且這些介面的編譯實現位於/usr/lib/x86_64-linux-gnu. 我有幾個問題:

  1. Linux 或任何 C 程序如何知道在哪裡查找標頭檔和 .so 文件?有沒有定義這個的文件?如果我想添加另一個預設源或標題文件夾(只是為了四處走動),是否可以修改這些引用?
  2. 如何避免衝突?例如,在 中libprocps-dev有一個/usr/include/proc/numa.h帶有定義的標頭檔void numa_uninit (void);。該文件的實現在/usr/lib/x86_64-linux-gnu/libprocps.so. 如果有人還編譯了另一個具有相同函式定義但具有另一個實現(或程式碼)的 .so 文件並將其添加到 .so 文件中/usr/lib/x86_64-linux-gnu怎麼辦?連結器如何知道哪個是必須連結到該標頭定義的正確 .so 文件?

謝謝。

我試圖了解 Linux 的工作原理以及如何建構模組。

建構核心模組不涉及“標準”C 編譯器目錄;相反,請參閱/lib/modules/$(uname -r)/build.

  1. C程序不知道去哪裡尋找標頭檔和庫;C 預處理器和編譯器可以。您可以使用查看標準包含目錄
gcc -xc -E -v - < /dev/null

(替換-xc-xc++C++),庫搜尋目錄使用

gcc -print-search-dirs
  1. 編譯器無法避免衝突;這取決於執行編譯器的任何人或任何人,以確保搜尋路徑不包含衝突的標頭。庫不會自動連結,您必須將庫添加到連結器命令行(-lprocps在您的範例中);任何其他庫都將被忽略。在這兩種情況下,當發生衝突時,編譯和/或連結會因錯誤而停止。

引用自:https://unix.stackexchange.com/questions/621539