g++가 /usr/*에서 기존 시스템 헤더/라이브러리를 연결/포함하는 것을 중지하는 방법은 무엇입니까?

g++가 /usr/*에서 기존 시스템 헤더/라이브러리를 연결/포함하는 것을 중지하는 방법은 무엇입니까?

일부 코드를 실행하려는 서버에는 표준 위치(gmp, mpc, mpfr)에 이전 버전의 gcc가 설치되어 있습니다. 예를 들어 관리자는 업데이트를 꺼려하지만 /usr*내 디렉토리 /home/username에 최신 버전의 gcc를 설치할 수 있습니다. 나는 이 작업을 완료했고 이제 g++d46gcc 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어떤 이유로 인해 위 헤더를 로컬에서 찾을 수 없는 문제가 해결되지 않을 수도 있습니다.

답변1

당신이 언급한 헤더는 glibc에 /lib64/libc.so속합니다 /lib64/libm.so(의 위치는 /lib64이미 이것이 핵심 시스템 파일임을 나타냅니다(그렇지 않은 경우 /usr/lib64).) 그러나 자신의 복사본을 이에 대해 링크할 수 있습니다. 그렇지 않으면 시도하는 것이 정말 중요합니다. 기본적으로 모든 것이 libc와 연결되어 있습니다. 즉, lib와 연결된 바이너리를 얻지 않도록 모든 것(GCC 및 아마도 이에 의존하는 모든 것을 포함하여)을 다시 컴파일해야 함을 의미합니다. -xyz 및 glibc 설치 및 lib-xyz는 시스템 glibc를 사용하므로 일부 불쾌한 부작용이 있을 수 있습니다.

새로운 툴체인을 구축하는 데 관심이 있다면 확실히 할 수 있지만 제대로 수행하려면 다음을 살펴봐야 합니다.처음부터 리눅스그리고 사용 사례에 적용되는 부분을 떼어내세요.

동적 링커가 어떻게 작동하는지 확인해보세요 man ld.so(이전 질문에서 제안한 대로). GCC가 포함된 헤더를 검색하는 방법을 이해하려면 -I--sysroot에 대해 읽어보세요 man gcc.

관련 정보