¿Por qué a los programadores de Linux les gusta compilar el código fuente que depende de la biblioteca en lugar de usar la biblioteca .so.a terminada?

antecedentes

Vine aquí temprano esta mañana, recibí un saludo de un estudiante de front-end en WeChat y me publiqué un error. ¿Por qué no puedo iniciar sesión en el entorno de mit?
Inserte la descripción de la imagen aquí
En un instante, recordé que las 3 máquinas en el entorno mit se detuvieron para depurar una función, lo que también provocó que el websocket anterior no pudiera iniciar sesión (PS: Android e ios inician sesión obteniendo direcciones IP dinámicas a través de el servicio de equilibrio de carga desarrollado por ellos mismos. Por lo tanto, no se verá afectado. Pero la web usa nginx + nombre de dominio, y las 3 máquinas asignadas por el nombre de dominio se detienen y definitivamente no podrán iniciar sesión).

Date prisa y saca la herramienta jenkins que creaste e implementa N máquinas con un solo clic. No es demasiado genial:
CICD usa Jenkins en combate real para lograr la implementación automatizada y el aislamiento del entorno.

Inserte la descripción de la imagen aquí
PD: El principio de funcionamiento de jenkins es aproximadamente como se muestra en la figura anterior. Cada vez que compila, primero extrae un código de github / gitlab, y después de la compilación (escriba su propio script), puede distribuirlo a múltiples máquinas que necesitan para ser implementado para implementación (escriba su propio script para controlar).

1. Haga clic en Build
Inserte la descripción de la imagen aquí
2. Vea el resultado de la consola.
Inserte la descripción de la imagen aquí
Encontré que todo es normal, pero el proceso simplemente no se inicia. ¿Cuál es el problema?

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

Entonces, lo ejecuté manualmente:
Inserte la descripción de la imagen aquí
¿Por qué no puedo 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

la razón

Para averiguar el motivo, utilicé ldd para ver las dependencias:
Máquinas que no se pueden ejecutar: Máquinas que
Inserte la descripción de la imagen aquí
funcionan bien:
Inserte la descripción de la imagen aquí
¿Por qué?

Al final, después de pasar más de una hora , descubrí que el log4cxx.so previamente compilado se usó directamente en el script build.sh en lugar de recompilar log4cxx cada vez.

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

Entonces, simplemente vuelva a compilar log4cxx. ldd mira el 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)

para resumir

Entonces, ¿por qué a los programadores de Linux les gusta compilar el código fuente de una biblioteca dependiente ? Creo que una de las razones es evitar el problema de bibliotecas dependientes no encontradas debido a entornos inconsistentes .

Apéndice
1. Comando ldd para ver dependencias

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 solo muestra no encontrado:

ldd msg_server |grep "not found"

Producción

libdb-4.7.so => not found

3. Desmontaje de Objdump para ver las bibliotecas dependientes que faltan

objdump -x liblog4cxx.so|grep NEEDED

Producción

[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

Supongo que te gusta

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