definición múltiple de error de zlib al construir con pybind11 y otros usos de lib zlib

Digamos que tengo libA y libB, ambos necesitan zlib 1.2.11, y ambos se compilan como lib estática. Mi entendimiento es que la lib estática acaba de juntar todos los archivos .o. como tal, tanto la libA como la libB necesitarán zutil.c.o para resolver símbolos en sus archivos .a. Ahora estoy tratando de construir otro proyecto que se basa en libA y libB, y que debe generar un archivo .so. así que durante el enlace, el enlace encontrará ambos zutil.c.o a través de libA y libB, si apuntan a diferentes zutil.c.o, entonces el error de múltiples definiciones de funciones zlibs ocurrirá.

La razón por la que estoy preguntando es que, tengo este tipo de error al intentar construir un proyecto. Pero lo raro es que, con la misma conanfile.py, pero con diferentes entornos de construcción tengo diferentes resultados. Estoy bajo ubuntu 18.04, tengo conan instalado sólo para el sistema python3. mi proyecto utiliza pybind11, así que tengo el propio python3 y python3-dev instalado (por ejemplo, en /usr/lib/x86_64-linux-gnu/libpython3.7m.so), También instalé conda, que tiene su propio pitón3 y python3-dev instalado (por ejemplo, en /home/username/anaconda3/lib/libpython3.7m.so), tengo todos los paquetes conan que se necesitan instalados, y son los mismos para todo el siguiente proceso de construcción, mi perfil conan establece la versión compilador de gcc a 9, y aquí es lo que sucede.

  1. si construyo en el python3 env de Conda, puedo conan construir el proyecto sin ningún problema, note que mi conda viene con gcc 7.3, así que tengo que set(CONAN_DISABLE_CHECK_COMPILER TRUE) para construir.
  2. Si construyo con el python3 env, y export CXX=/usr/lib/ccache/g++ así que el gcc del sistema se utiliza (en realidad estoy usando ccache aquí), no necesito set(CONAN_DISABLE_CHECK_COMPILER TRUE), entonces tuve el siguiente error:

/usr/bin/ld: no puede encontrar /lib/libpthread.so.0 /usr/bin/ld: no puede encontrar /usr/lib/libpthread_nonshared.a collect2: error: ld devuelto 1 estado de salida

  1. si construyo en el sistema python3 env, y mi sistema tiene gcc 9.3, tengo el siguiente error:

/home/username/.conan/data/zlib/1.2.11///package/6af9cc7cb931c5ad942174fd7838eb655717c709/lib/libz.a(zutil.o): En función zlibVersion': zutil.c:(.text+0x0): multiple definition of ZlibVersion ' /home/username/.conan/data/pcl/1.11.0///package/a4ccc62deb773be50caa050a2fb7f7e769a17a54/lib/libpcl_surface.a(zutil.c):zutil.c:(.text+0x0): first defined here /home/username/.conan/data/zlib/1.2.11///package/6af9cc7cb931c5ad942174fd7838eb655717c709/lib/libz.a(zutil.o): En función zlibCompileFlags': zutil.c:(.text+0x10): multiple definition of zlibCompileFlags ' /home/username/.conan/data/pcl/1.11.0///package/a4ccc62deb773be50caa050a2fb7f7e769a17a54/lib/libpcl_surface.a(zutil.c):zutil.c:(.text+0x10): primero definido aquí /home/username/.conan/data/zlib/1.2.11///package/6af9cc7cb931c5ad942174fd7838eb655717c709/lib/libz.a(zutil.o):(.data.rel.ro.local+0x0): multiple definition of `z_errmsg ' /home/username/.conan/data/pcl/1.11.0///package/a4ccc62deb773be50caa050a2fb7f7e769a17a54/lib/libpcl_surface.a(zutil.c.o):(.data.rel.ro.local+0x0): primera definida aquí collect2: error: ld devuelto 1 estado de salida

Si no uso conan build, simplemente use el archivo cmake generado por conan y construya por cmake entonces es todo el mismo error de definición múltiple para todos los casos. ¿Qué soy malintencionado aquí? ¿O me perdí algo?

Pregunta hecha hace 3 años, 4 meses, 27 días - Por binaryblossom


3 Respuestas:

  • Creo que acabo de descubrir qué causa esta definición múltiple. Tengo esta línea en mis cmakelists. archivo txt target_link_libraries(${TARGET} PUBLIC ${PYTHON_LIBRARIES})y éste busca libs estáticas de pitón, y así se vinculará con la dependencia de zlib para el pitón mismo. Esto difiere y por lo tanto conflictos con el instalado por conan.

    Al construir usando el pitón de Conda, por alguna razón, tal vez la versión de zlib en conda' python construir utiliza la misma versión de zlib.

    La cosa perdida de pthread es debido a algunas banderas de complier cxx setted por conda al activar su entorno de pitón.

    Respondida el Dec 18, 2020 a las 16:09 - por scriptsorcererf493

    Votos positivos: 0 | Votos negativos: 0

  • El error de "multiple definition" que estás experimentando se debe a la presencia de múltiples definiciones de las mismas funciones o variables en las bibliotecas que estás utilizando. En este caso, parece ser que las bibliotecas libA, libB, zlib y pcl_surface están incluyendo el mismo archivo zutil.c, lo que provoca conflictos durante el enlace.

    Para solucionar este problema, puedes considerar las siguientes opciones:

    • Evitar la inclusión de zutil.c en múltiples bibliotecas: Una solución sería modificar las bibliotecas libA, libB, zlib y pcl_surface para evitar la inclusión de zutil.c de manera redundante. Podrías revisar la configuración de las bibliotecas para asegurarte de que no se incluya el mismo archivo en más de una de ellas.
    • Utilizar namespaces o nombres únicos: Otra opción es utilizar namespaces o prefijos únicos en las funciones y variables en zutil.c para evitar conflictos de nombres. Así, cada biblioteca tendría su versión única de las funciones.
    • Separar las dependencias en diferentes contextos de construcción: Puedes intentar compilar las bibliotecas y tu proyecto final en contextos de construcción separados, utilizando por ejemplo entornos virtuales o contenedores, para evitar conflictos entre las versiones de las bibliotecas.
    • Revisar la configuración de la construcción: Asegúrate de revisar detalladamente la configuración de la construcción y las opciones de enlace para descartar cualquier configuración incorrecta que pueda estar causando el error.
    • Consultar la documentación de las bibliotecas: Revisa la documentación de las bibliotecas que estás utilizando para asegurarte de estar siguiendo las mejores prácticas y evitar posibles conflictos entre ellas.

    Espero que estas sugerencias te ayuden a resolver el problema de las definiciones múltiples en tu proyecto. Si necesitas más ayuda, no dudes en preguntar.

    Respondida el Dec 19, 2020 a las 16:07 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Problema:

    Error de definición múltiple de funciones y variables de zlib al vincular un proyecto que depende de varias bibliotecas que usan zlib.

    Causas posibles:

    Las bibliotecas estáticas vinculadas contienen funciones y variables de zlib duplicadas. El compilador no puede determinar el orden de vinculación correcto de las bibliotecas.

    Soluciones:

    1. Verifica el orden de vinculación:

    Asegúrate de que las bibliotecas que dependen de zlib se vinculen antes que las propias bibliotecas de zlib. En CMake, puedes usar la propiedad LINK_DEPENDS para especificar dependencias de vinculación.

    2. Usa bibliotecas dinámicas:

    En lugar de usar bibliotecas estáticas, considera usar bibliotecas dinámicas (</strong>.so o <strong>.dll). Esto evitará que los símbolos de zlib se dupliquen en el ejecutable final.

    3. Elimina bibliotecas duplicadas:

    Identifica las bibliotecas que están vinculando funciones de zlib duplicadas. Si es posible, elimina las bibliotecas duplicadas o asegúrate de que solo se vincule una vez.

    4. Crea una versión personalizada de zlib:

    Si las soluciones anteriores no funcionan, puedes crear una versión personalizada de zlib que solo contenga las funciones necesarias para tu proyecto. Esto puede eliminar las definiciones de funciones duplicadas.

    5. Usa un compilador diferente:

    Si es posible, intenta usar un compilador diferente. Algunos compiladores pueden manejar mejor los símbolos duplicados que otros.

    Pasos adicionales:

    Verifica las definiciones de las bibliotecas: Inspecciona los archivos de encabezado y los archivos de definición de biblioteca para asegurarte de que las funciones y variables de zlib se declaran consistentemente. Comprueba la configuración de CMake: Asegúrate de que la configuración de CMake para el proyecto esté configurada correctamente para evitar la vinculación de símbolos duplicados. Limpia y vuelve a construir: A veces, limpiar y reconstruir el proyecto puede resolver problemas de vinculación. Busca ayuda: Si no puedes resolver el problema por tu cuenta, considera publicar tu pregunta en foros o comunidades en línea para obtener asistencia adicional.

    Respondida el Dec 19, 2020 a las 16:12 - por Gemini

    Votos positivos: 0 | Votos negativos: 0