Por que os programadores do Linux gostam de compilar o código-fonte que depende da biblioteca em vez de usar a biblioteca .so.a concluída?

fundo

Vim aqui esta manhã, recebi uma saudação de um aluno front-end no WeChat e postei um bug para mim. Por que não consigo fazer login no ambiente mit?
Insira a descrição da imagem aqui
Em um instante, lembrei que as 3 máquinas no ambiente mit foram todas paradas para depurar uma função, o que também fez com que o websocket acima falhasse ao fazer login (PS: android e ios estão logados obtendo endereços IP dinâmicos através de o serviço de balanceamento de carga desenvolvido por eles mesmos. Portanto, não será afetado. Mas a web usa nginx + nome de domínio e as 3 máquinas mapeadas pelo nome de domínio são interrompidas e definitivamente não poderão fazer login.)

Apresse-se e retire a ferramenta jenkins que você construiu e implante N máquinas com um clique. Não é muito legal: o
CICD usa o Jenkins em combate para obter implantação automatizada e isolamento de ambiente

Insira a descrição da imagem aqui
PS: O princípio de funcionamento do jenkins é mais ou menos como mostrado na figura acima. Cada vez que você compila, você primeiro extrai um código do github / gitlab e, após a compilação (escreve seu próprio script), pode distribuí-lo para várias máquinas que precisam a ser implantado para implantação (escreva seu próprio script para controlar).

1. Clique em Build
Insira a descrição da imagem aqui
2. Visualize o resultado do console.
Insira a descrição da imagem aqui
Descobri que tudo está normal, mas o processo simplesmente não inicia. Qual é o problema?

[root@10-0-59-178 webapps]# ls
online.base.immsgserver.service  online.base.immsgserver.service.202006026

Então, eu o executei manualmente:
Insira a descrição da imagem aqui
Por que não consigo encontrar libdb-4.7.so?

[root@10-0-59-178 msg_server]# whereis libdb-4.7.so
libdb-4.7:[root@10-0-59-178 msg_server]#
[root@10-0-59-178 msg_server]# whereis libdb-5.3.so
libdb-5.3: /usr/lib64/libdb-5.3.so

a razão

Para descobrir o motivo, usei o ldd para dar uma olhada nas dependências:
Máquinas que não podem ser executadas: Máquinas que
Insira a descrição da imagem aqui
funcionam bem:
Insira a descrição da imagem aqui
por que isso?

No final, depois de passar mais de uma hora , descobri que o log4cxx.so compilado anteriormente foi usado diretamente no script build.sh em vez de recompilar log4cxx todas as vezes.

copy_libs(){
    
    
    # lib
    # 解决jekins发布job编译过长问题,故提前编译好protobuf、log4cxx、hiredis等,节约时间
    cp ${CUR_DIR}/lib/linux/* ${CUR_DIR}/lib/
}

Portanto, apenas recompile o log4cxx. ldd veja o compilado:

[root@10-0-59-231 linux]# ldd liblog4cxx.so
	linux-vdso.so.1 =>  (0x00007ffd36155000)
	libaprutil-1.so.0 => /usr/lib64/libaprutil-1.so.0 (0x00007f8597d0b000)
	libldap_r-2.4.so.2 => /usr/lib64/libldap_r-2.4.so.2 (0x00007f8597aab000)
	liblber-2.4.so.2 => /usr/lib64/liblber-2.4.so.2 (0x00007f859789c000)
	libexpat.so.1 => /usr/lib64/libexpat.so.1 (0x00007f8597672000)
	libdb-5.3.so => /usr/lib64/libdb-5.3.so (0x00007f85972b2000)

Resumindo

Então, por que os programadores do Linux gostam de compilar o código-fonte de uma biblioteca dependente ? Acho que um dos motivos é evitar o problema de não encontrar bibliotecas dependentes devido a ambientes inconsistentes .

Apêndice
1. Comando ldd para visualizar dependências

ldd msg_server
linux-vdso.so.1 =>  (0x00007fff3d4fc000)
libslog.so => ./libslog.so (0x00007fad6a9be000)
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007fad6a555000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fad6a339000)
libssl.so.10 => /lib64/libssl.so.10 (0x00007fad6a0c7000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fad69dbd000)
libm.so.6 => /lib64/libm.so.6 (0x00007fad69abb000)

2.ldd exibe apenas não encontrado:

ldd msg_server |grep "not found"

Resultado

libdb-4.7.so => not found

3. Desmontagem Objdump para ver as bibliotecas dependentes ausentes

objdump -x liblog4cxx.so|grep NEEDED

Resultado

[root@10-0-59-178 msg_server]# objdump -x liblog4cxx.so|grep NEEDED
  NEEDED               libaprutil-1.so.0
  NEEDED               libldap-2.4.so.2
  NEEDED               liblber-2.4.so.2
  NEEDED               libexpat.so.1
  NEEDED               libdb-4.7.so
  NEEDED               libapr-1.so.0
  NEEDED               libpthread.so.0
  NEEDED               libstdc++.so.6
  NEEDED               libm.so.6
  NEEDED               libc.so.6
  NEEDED               libgcc_s.so.1

Acho que você gosta

Origin blog.csdn.net/xmcy001122/article/details/106493004
Recomendado
Clasificación