如何停止 g++ 連結/包括來自 /usr/* 的舊系統標頭檔/庫?
我想執行一些程式碼的伺服器在標準位置安裝了舊版本的 gcc(gmp、mpc、mpfr),比如
/usr*
管理員不願意更新,但允許我在我的/home/username
目錄中安裝新版本的 gcc。我已經這樣做了,現在g++d46
在我的主目錄中安裝了 gcc 4.6.3/home/myusername/opt2/gcc-4.6.3
。我也有 gmp,mpfr,mpc 安裝在/home/myusername/tmp/gcc/{include,lib,share}
.我已經出口
{LD_LIBRARY_PATH, LIBRARY_PATH,LD_RUN_PATH}=/home/myusername/tmp2/gcc/lib:/home/myusername/opt2/gcc-4.6.3/lib/gcc/x86_64-unknown-linux-gnu/4.6.3:/home/myusername/opt2/gcc-4.6.3/lib64:
了PATH=/bin:/usr/bin:/home/myusername/opt2/gcc-4.6.3/bin:``{C_INCLUDE_PATH,CPLUS_INCLUDE_PATH}=/home/myusername/tmp2/gcc/include:/home/myusername/opt2/gcc-4.6.3/include/c++/4.6.3:
然後我編譯一些測試程式碼
g++d46 -g -O3 -I/home/myusername/tmp2/gcc/include -L/home/myusername /tmp2/gcc/lib -Wall testMPFR3.cpp -o myBin -lgmp -lgmpxx -lmpfr
它編譯並執行正常,但是在這樣做時,
ldd myBin
我發現儘管大部分都與我的主目錄上的正確庫連結,但我們也有:libm.so.6 => /lib64/libm.so.6 (0x0000003917e00000) libc.so.6 => /lib64/libc.so.6 (0x0000003917a00000) /lib64/ld-linux-x86-64.so.2 (0x0000003917600000)
那些不在我的主目錄上,考慮到我導出的環境變數和我的標誌,它怎麼知道去別處
-I
看-L
?此外,如果我確實
g++ -H
要查看標頭的來源,那麼大多數(包括新的 gmp、mpfr 謝天謝地)都來自我的主目錄,但有一些:..... /usr/include/sys/cdefs.h ...... /usr/include/bits/wordsize.h ..... /usr/include/gnu/stubs.h ...... /usr/include/bits/wordsize.h ...... /usr/include/gnu/stubs-64.h ........ /usr/include/stdio.h ........ /usr/include/bits/wchar.h ........ /usr/include/xlocale.h ....... /usr/include/locale.h ..... /usr/include/ctype.h ....... /usr/include/bits/types.h ........ /usr/include/bits/wordsize.h ........ /usr/include/bits/typesizes.h ....... /usr/include/endian.h ........ /usr/include/bits/endian.h ........ /usr/include/pthread.h ......... /usr/include/sched.h .......... /usr/include/time.h .......... /usr/include/bits/sched.h ......... /usr/include/time.h .......... /usr/include/bits/time.h ......... /usr/include/signal.h .......... /usr/include/bits/sigset.h ......... /usr/include/bits/pthreadtypes.h .......... /usr/include/bits/wordsize.h ......... /usr/include/bits/setjmp.h .......... /usr/include/bits/wordsize.h
我不明白為什麼我的本地 gcc-4.6.3 缺少這些?
/usr/*
如果連結器在主目錄上找不到它們,也不知道如何恢復?也許我可以在編譯時使用該標誌
--nostdinc
,但這可能無法解決由於某種原因在本地找不到上述標頭的問題。
您提到的標頭以及
/lib64/libc.so
屬於/lib64/libm.so
glibc 的標頭(因為在中的位置/lib64
已經表明這些是核心系統文件(否則它們將在 中/usr/lib64
)。如果您編譯自己的副本,您當然可以將您的程序連結到它。但是除非這對你來說真的很重要,否則盡量不要 - 基本上所有東西都連結到 libc,這意味著你應該重新編譯所有東西(包括你的 GCC 和它可能依賴的任何東西),以確保你最終不會得到一個二進製文件,即與 lib-xyz 和您的 glibc 安裝的連結,而 lib-xyz 將使用系統 glibc。這可能會產生一些令人討厭的副作用。如果您有興趣建構一個更新的工具鏈,當然可以做到,但要正確地做到這一點,您可能應該從頭開始看看Linux並撕下適用於您的案例的部分。
至於動態連結器的工作原理 - 檢查
man ld.so
(正如我在您之前的問題中所建議的那樣)。要了解 GCC 如何搜尋包含的標頭,您可能需要-I
閱讀關於--sysroot
.man gcc