como especificar o libstdc ++. so.6 para usar

4

Estou tentando compilar um programa meu que precisa de recursos C++11 e uma versão mais recente de boost do que está instalado na máquina de destino. Por isso, compilei e instalei gcc 4.9 em algum diretório local ( /secured/local ) com uma compilação em árvore de todas as dependências e binutils. Eu então baixei boost 1.55 e executei ./boostrap.sh --prefix=/secured/local && ./b4 install para instalar o boost. Ambas as compilações funcionaram bem e gcc -std=c++11 também funciona.

Meu programa é construído usando o cmake com o procedimento usual FindXX.cmake de localizar arquivos. Estou correndo cmake assim:

cmake ../source/ -DBOOST_ROOT=/secured/local -DCMAKE_EXE_LINKER_FLAGS='-Wl,-rpath,/secured/local/lib'

que encontra com sucesso a minha nova instalação de reforço e a nova versão do gcc. Compilação e ligando ambos funcionam perfeitamente. No entanto, após a execução do meu programa, estou recebendo os seguintes erros:

$ ./surface
./surface: /usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.20' not found (required by ./surface)
./surface: /usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.11' not found (required by ./surface)
./surface: /usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.9' not found (required by ./surface)
./surface: /usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.19' not found (required by ./surface)
./surface: /usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.9' not found (required by /secured/local/lib/libconfig++.so.9)
./surface: /usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.9' not found (required by /secured/local/lib/libboost_program_options.so.1.55.0)
./surface: /usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.11' not found (required by /secured/local/lib/libboost_program_options.so.1.55.0)
./surface: /usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.20' not found (required by /secured/local/lib/libboost_program_options.so.1.55.0)
./surface: /usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.20' not found (required by /secured/local/lib/libboost_filesystem.so.1.55.0)
./surface: /usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.20' not found (required by /secured/local/lib/libboost_regex.so.1.55.0)
./surface: /usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.11' not found (required by /secured/local/lib/libboost_regex.so.1.55.0)
./surface: /usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.9' not found (required by /secured/local/lib/libboost_regex.so.1.55.0)
./surface: /usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.15' not found (required by /secured/local/lib/libboost_regex.so.1.55.0)

Execução de objdump nos shows de reforço

objdump -x /secured/local/lib/libboost_program_options.so.1.55.0 | grep stdc++
  NEEDED               libstdc++.so.6
  required from libstdc++.so.6:

Parece que ambas as bibliotecas de reforço tentam usar o antigo /usr/lib64/libstdc++.so.6 em vez do novo em /secured/local/lib . O que fiz de errado no meu procedimento?

Note que tento evitar definir o LD_LIBRARY_PATH em algum lugar.

    
por janoliver 03.06.2014 / 15:34

1 resposta

10

A instalação de gcc coloca libstdc++.so.6 em $PREXIF/lib e $PREFIX/lib64 . Usando o último como RPATH para aumentar e meu programa resolveu o problema. Usando apenas o primeiro resulta em um retorno ao sistema libstdc++.so.6 .

    
por 04.06.2014 / 15:32