gcc 的搜尋路徑與 sysroot

Linux Teamo • at 2019-03-19 03:04:13 • 730 Views

指定 sysroot 路徑引數後,gcc 就不從自己的預設庫 sysroot 裡搜尋了。 這個問題很奇怪,自己編譯的和樹梅派官方的 gcc 都有這個問題, 但 ubuntu 源拉的 gcc 卻沒這個問題。

sysroot 的 libc6 裡的 sys/cdefs.h 路徑不在 /usr/lib/inlcude gcc 自帶的 sysroot 卻在這個路徑上有。

所以,gcc 編譯的時候要加些什麼才能正常搜尋自己的 glib 和其他的庫?

Total: 8
  • MenghanKing 2019-03-18 20:03:15
    編譯條件裡-I -L 跟指定的標頭檔案和庫檔案的路徑,c 和 cpp 標頭檔案和動靜態庫環境變數分別為 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,LD_LIBRARY_PATH,LIBRARY_PATH
  • Teamo 2019-03-18 20:04:15
    @MenghanKing 這個我都試過了,編譯會出問題,只能設定一個路徑。
    **gcc --print-search-dirs 實際上有多個路徑,不同的庫路徑也不一樣。
    問題是 sysroot 引數導致 gcc 不從自己的--print-search-dirs 那些路徑去搜索了。
  • Teamo 2019-03-18 20:04:15
    接上面,CPATH 等環境變數會導致多個不同目標的 gcc 都用同一個路徑。
    這個是很麻煩的大問題。
  • bp0 2019-03-18 21:07:15
    sysroot 不就是用來做交叉編譯的時候指定目標機的標頭檔案路徑嗎?就是為了方便不用寫一堆-I 引數吧。

    如果這個時候還去預設的路徑去找,才應該奇怪的。你確定在預設路徑找到的標頭檔案能直接用?
  • henglinli 2019-03-18 23:02:15
    "gcc 編譯"指的是使用 gcc 交叉編譯還是編譯 gcc(bootstrap)用來交叉編譯?若是後者,without-headers 選項需要;若是前者,你的 gcc 安裝有問題.請注意閲讀 https://gcc.gnu.org/onlinedocs/gcc-8.3.0/gcc/Fixed-Headers.html#Fixed-Headers
    它大概是講 gcc 包含預設標頭檔案及其原因和部分細節,由於英文水平有限無法幫你翻譯.

    其他本人認為有用的資訊:
    glibc 和 binutils 應該由同一個編譯器編譯而來.(確認是否安裝了多個版本的 glibc 和 binutls.)
    一般的交叉編譯環境都是 chroot 進去用的,我相信知道 exherbo 都很少,遑論使用它的 multiarch.(最好用 chroot 的方式的 sdk).
    osdevwiki https://wiki.osdev.org
  • Teamo 2019-03-19 00:04:15
    這個問題主要歸結於為什麼 ubuntu 源的交叉編譯的 gcc 和自己編譯的或在樹梅派提供的 gcc 的執行表現不一樣。
    顯然 ubuntu 的 gcc 是正常的,按樓上的說法就是沒問題,編譯的程式就應該用編譯工具自帶的基礎庫。
    sysroot 顯然是提供額外的依賴庫,而不是直接替換掉 gcc 的所有依賴庫。

    看樣子只能對比各個 gcc 的編譯引數然後看看到底是如何產生差異的。
  • gulili 2019-03-19 01:04:15
    1 樓說的沒問題,-rpath 可以給預設搜尋路徑如果不設環境變數的話。建議貼出來具體的命令。
  • Teamo 2019-03-19 15:28:15
    問題發現了
    這個是 ubuntu 版 gcc 的搜尋路徑:
    ignoring nonexistent directory "/home/t/rpi/sysroot/usr/local/include/arm-linux-gnueabihf"
    #include "..." search starts here:
    #include <...> search starts here:
    /usr/lib/gcc-cross/arm-linux-gnueabihf/7/../../../../arm-linux-gnueabihf/include/c++/7
    /usr/lib/gcc-cross/arm-linux-gnueabihf/7/../../../../arm-linux-gnueabihf/include/c++/7/arm-linux-gnueabihf
    /usr/lib/gcc-cross/arm-linux-gnueabihf/7/../../../../arm-linux-gnueabihf/include/c++/7/backward
    /usr/lib/gcc-cross/arm-linux-gnueabihf/7/include
    /usr/lib/gcc-cross/arm-linux-gnueabihf/7/include-fixed
    /usr/lib/gcc-cross/arm-linux-gnueabihf/7/../../../../arm-linux-gnueabihf/include
    /home/t/rpi/sysroot/usr/include/arm-linux-gnueabihf
    /home/t/rpi/sysroot/usr/include
    這個是自己編譯的 gcc 搜尋路徑:
    ignoring nonexistent directory "/home/t/rpi/sysroot/home/t/x-tools/arm-unknown-linux-gnueabihf/arm-unknown-linux-gnueabihf/sysroot/include"
    #include "..." search starts here:
    #include <...> search starts here:
    /home/t/x-tools/arm-unknown-linux-gnueabihf/lib/gcc/arm-unknown-linux-gnueabihf/8.3.0/../../../../arm-unknown-linux-gnueabihf/include/c++/8.3.0
    /home/t/x-tools/arm-unknown-linux-gnueabihf/lib/gcc/arm-unknown-linux-gnueabihf/8.3.0/../../../../arm-unknown-linux-gnueabihf/include/c++/8.3.0/arm-unknown-linux-gnueabihf
    /home/t/x-tools/arm-unknown-linux-gnueabihf/lib/gcc/arm-unknown-linux-gnueabihf/8.3.0/../../../../arm-unknown-linux-gnueabihf/include/c++/8.3.0/backward
    /home/t/x-tools/arm-unknown-linux-gnueabihf/lib/gcc/arm-unknown-linux-gnueabihf/8.3.0/include
    /home/t/x-tools/arm-unknown-linux-gnueabihf/lib/gcc/arm-unknown-linux-gnueabihf/8.3.0/include-fixed
    /home/t/x-tools/arm-unknown-linux-gnueabihf/lib/gcc/arm-unknown-linux-gnueabihf/8.3.0/../../../../arm-unknown-linux-gnueabihf/include
    /home/t/rpi/sysroot/usr/include
    這兩個都使用了 sysroot 引數到 /home/t/rpi/sysroot
    官方版的多了倒數第二條的到 /usr/include/arm-linux-gnueabihf 的路徑
    這條路徑是確實是 libc6 的位置,但 gcc 編譯自帶的是 /usr/include
    也就是編譯帶了 sysroot 後,確實修改了 sysroot 到自定義的路徑,gcc 不再用自己的庫
    但是自己編譯的 gcc 因為沒有這個倒數第二條的這條路徑,所以沒法正確的找到 libc6.deb 而對應的路徑。

    具體怎麼設定出正確的路徑,看來我要繼續翻手冊了,QAQ
Add a reply
For Commenting you need to Login. If you dont have a Account you need to Register.