Não é possível localizar a localização da libncurses.so ao executar um arquivo

1

Estou tentando executar uma compilação remota de nome de arquivo, que é criar um pacote em um servidor de destino. Meu servidor de destino é o HP-UX-itanium de 64 bits. Quando eu executo a compilação remota, de alguma forma não é possível encontrar libncurses.so ou talvez procure o libncurses.so em algum outro local. Isso só acontece no HP-UX itanium, enquanto outro servidor como o Solaris, o HP-UX-mp de 32 bits e outras plataformas Unix podem executar o arquivo sem problemas.

Este é o código de erro:

libtool: link: gcc -g -O2 -o test_setpwnam test_setpwnam.o setpwnam.o  -L/usr/local/lib/hpux32 -lncurses -lsec -ldl -lpam -lpthread -Wl,+b -Wl,/usr/local/lib
/usr/bin/make  check-TESTS
/usr/lib/hpux32/dld.so: Unable to find library 'libncurses.so'.

Eu não sei por que continuar pesquisando _/usr/lib/hpux32_ quando eu acho que o código examina /usr/local/lib/hpux32"_ (o libncurses.so está localizado nesse diretório).

Isso faz parte do código de compilação remota que eu acho que está relacionado.

#!/usr/bin/perl

my $remote_uname = 'ssh $USER\@$host uname -a';
chomp($remote_uname);
my $local_uname = 'uname -a';
chomp($local_uname);
my $homepath = "/home";
my $build = "";
my $configure_param = " --with-ncurses --disable-openssl --disable-thread-support --disable-shared --disable-protoc";
my $gzip = "gzip";
my $configure_env = "PATH=\$PATH:/usr/local/bin:/usr/local/lib/hpux32 CPPFLAGS=-I/usr/local/include libevent_cv_getaddrinfo=no";
my $make_env = "PATH=\$PATH:/usr/local/bin";
my $whoami = "whoami";

} elsif ($remote_uname =~ /^HP-UX/) {
    $build = "cd mypackage-$version/package/hpux && sh ./build.sh";
    $gzip = "/usr/contrib/bin/gzip";
    $configure_param .= " --with-ncurses";
    $configure_env .= " LDFLAGS=\"-L/usr/local/lib/hpux32\""; //aint this the part where I'm suppose to specify the search?
    die "Unknown remote uname [$remote_uname]";
}

rmake "rm -rf mypackage-${version}*";
make "scp mypackage-$version.tar.gz $USER\@$host:$homepath/$USER";
rmake "$gzip -dc mypackage-$version.tar.gz | tar xvf -";
rmake "cd mypackage-$version && $configure_env ./configure $configure_param && $make_env make && $make_env make check";
rmake $build;

Esta é a primeira vez que faço depuração em código perl, então, por favor, desculpe-me se o que eu concluo está errado.

    
por Mohd Fikrie 02.12.2013 / 10:12

1 resposta

1

I have tried compiling it manually before posting it here, it does work. I'm actually out of idea on how to debug it since my knowledge on perl is really low.

O erro parece acontecer quando você executa este passo $make_env make check no seu script perl. Você criou test_setpwnam e, quando executado, você obtém:

/usr/lib/hpux32/dld.so: Unable to find library 'libncurses.so'.

O problema é que test_setpwnam depende de libncurses.so , mas a pesquisa de caminho dinâmico da biblioteca compartilhada de test_setpwnam não inclui / usr / local / lib / hpux32. Ele não inclui / usr / local / lib / hpux32 porque quando você (ou seu script) estava criando test_setpwnam você adicionou à linha de comando -Wl,+b -Wl,/usr/local/lib e limpou todos os caminhos padrão.

Existem algumas maneiras de corrigir o problema:

1) Adicione a configuração de pesquisa dinâmica a LDFLAGS. Este é um exemplo:

$configure_env .= "LDFLAGS=\"-L/usr/local/lib/hpux32 -Wl,+concatrpath -Wl,+b -Wl,/usr/local/lib -Wl,+b -Wl,/usr/local/lib/hpux32\""; 

2) Você pode definir a variável de ambiente LD_LIBRARY_PATH. Essa variável expande a pesquisa do caminho dinâmico da biblioteca compartilhada. Mudança no seu script:

my $make_env = "PATH=\$PATH:/usr/local/bin LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/usr/local/lib/hpux32";

3) Se você puder encontrar onde -Wl,+b -Wl,/usr/local/lib é adicionado, elimine-o. No HP-UX, o vinculador definirá uma pesquisa de caminho dinâmico de biblioteca compartilhada correta que inclua todos os caminhos necessários

    
por 04.12.2013 / 07:13