libstdc ++. so.6: open failed: Nenhum arquivo ou diretório

2

Estou tentando executar meu primeiro programa C ++ no Solaris. Apenas um simples programa Hello World. Quando eu tento correr. Eu recebo o erro libstdc++.so.6:open failed:No such file or directory . É claro que fiz algumas pesquisas e descobri que posso resolver isso configurando a variável de ambiente:

export LD_LIBRARY_PATH=/usr/local/lib

Após o relog, descobri que não era uma maneira permanente de resolvê-lo. Eu estou supondo que isso tem algo a ver com a vinculação do libstdc ++. So.6 durante a compilação. Aqui está o passo que eu fiz desde o começo:

bash-3.2# gcc -c test.cpp

bash-3.2# gcc -o test test.o -lstdc++

bash-3.2# ./test
   libstdc++.so.6:open failed:No such file or directory

bash-3.2# ldd test | grep not
   libstdc++.so.6 =>        (file not found)

bash-3.2# /usr/ccs/bin/elfdump test | grep RUNPA

bash-3.2# find /usr -name libstdc++.so.6
   /usr/local/lib/libstdc++.so.6

Eu perdi uma bandeira ou algo assim durante a compilação? Como faço para criar um softlink para que ele saiba onde procurar ao executar esse programa?

Esta é a plataforma que estou usando:

bash-3.2# uname -a
   SunOS ms-sparc8 5.8 Generic_108528-13 sun4u sparc SUNW,Sun-Blade-100

bash-3.2# gcc -v
   Reading specs from /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.3.2/specs
   Configured with: ../configure --with-as=/usr/ccs/bin/as --with-ld=/usr/ccs/bin/ld --disable-nls --disable-libgcj --enable-languages=c,c++
   Thread model: posix
   gcc version 3.3.2
    
por Mohd Fikrie 09.05.2014 / 10:39

3 respostas

2

A maneira mais fácil de definir o caminho de pesquisa do vinculador de tempo de execução do Solaris é usar crle , mas você precisa ser muito cuidadoso ao fazer isso, pois pode facilmente inutilizar seu sistema se o quebrar! Para adicionar /usr/local/bin ao caminho do vinculador:

# crle -u -l /usr/local/lib

Depois de fazer isso, chame crle para verificar o novo caminho de pesquisa.

Uma alternativa é compilar o caminho para o próprio binário:

$ gcc -Wl,-rpath,/usr/local/lib -o test test.o -lstdc++

O acima é uma opção melhor, pois o binário funcionará em outros sistemas sem ter que ajustar o caminho do vinculador.

    
por 09.05.2014 / 11:10
1

O problema é que o carregador Solaris não consegue encontrar a biblioteca.

A melhor coisa a fazer é definir a variável de ambiente LD_RUN_PATH durante a compilação para o diretório em que libstdc ++. so.xxxx (seu número de versão) reside. Isso diz ao vinculador para pesquisar esse diretório em tempo de execução.

Note that LD_RUN_PATH is not to be confused with LD_LIBRARY_PATH. The latter is parsed at run-time, while LD_RUN_PATH essentially compiles in a library path into the executable, so that it doesn't need a LD_LIBRARY_PATH setting to find its libraries.

Se tudo mais falhar, você sempre poderá executar seus programas a partir de scripts de shell de wrapper que configuram a variável de ambiente LD_LIBRARY_PATH apropriadamente.

Isso está em uma essência,

  • defina o LD_LIBRARY_PATH , se não estiver incluído em /usr/local/lib :

    LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib ; export LD_LIBRARY_PATH

  • Os arquivos
  • gcc normalmente são instalados em /usr/lib/gcc/ .

Em seguida, vincule o libstdc ++. so.6 do diretório instalado ao /usr/lib ou /usr/local/lib usando a vinculação suave

sudo ln -s libstdc++.so.6 /usr/lib/<filename>
    
por 09.05.2014 / 11:17
0

Primeiro, não há necessidade de usar o crle (e, a menos que você realmente entenda o que está fazendo, fique longe disso; confie em mim, você se trancará com erros de execução malucos quando usar errado)

Segundo, não há necessidade de definir LD_LIBRARY_PATH, nunca (bem principalmente), também não há necessidade de fazer symlink de quaisquer bibliotecas de terceiros em / usr

Basta fazer o que mjturner sugere e fornecer ao gcc o caminho de tempo de execução correto ao compilar

PS: código C ++ deve ser compilado com g ++

Links:

link link

    
por 24.05.2014 / 02:04

Tags