O servidor em que quero executar algum código tem versões antigas do gcc (gmp, mpc, mpfr também) instaladas nos locais padrão, como /usr*
, o administrador não quer atualizar, mas me permitiu instalar uma nova versão do gcc no meu diretório /home/username
. Eu fiz isso e agora tenho g++d46
como gcc 4.6.3 instalado no meu diretório home /home/myusername/opt2/gcc-4.6.3
. Eu também tenho gmp, mpfr, mpc instalado em /home/myusername/tmp/gcc/{include,lib,share}
.
Eu exportei {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:
e PATH=/bin:/usr/bin:/home/myusername/opt2/gcc-4.6.3/bin:
também {C_INCLUDE_PATH,CPLUS_INCLUDE_PATH}=/home/myusername/tmp2/gcc/include:/home/myusername/opt2/gcc-4.6.3/include/c++/4.6.3:
Eu então compilo um código de teste com
g++d46 -g -O3 -I/home/myusername/tmp2/gcc/include -L/home/myusername
/tmp2/gcc/lib -Wall testMPFR3.cpp -o myBin -lgmp -lgmpxx -lmpfr
que compila e executa OK, mas ao fazer ldd myBin
, vejo que, apesar de estarem principalmente vinculados às libs corretas em meu diretório home , também temos:
libm.so.6 => /lib64/libm.so.6 (0x0000003917e00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003917a00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003917600000)
que não estão no meu diretório home, como é que ele sabe procurar em outro lugar, dado o env vars que eu exportei e meus -I
e -L
flags?
Além disso, se eu fizer g++ -H
para ver de onde os cabeçalhos estão vindo, novamente a maioria (incluindo o novo gmp, mpfr felizmente) vem do meu diretório inicial, mas alguns:
..... /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
Eu não entendo porque meu gcc-4.6.3 local está faltando isso? nem como o vinculador sabe reverter para /usr/*
se não encontrá-los no diretório home?
Eu poderia usar a sinalização --nostdinc
na compilação talvez, mas isso provavelmente não resolverá o problema de que os cabeçalhos acima não podem ser encontrados localmente por algum motivo.