es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se puede enlazar la biblioteca compartida en cmake debido a que no se encuentra la imagen.

Estoy tratando de incluir una biblioteca compartida construida con bazel en mi proyecto cmake. Pude encontrar la biblioteca, como se puede ver en el resultado del terminal, pero tan pronto como quiero vincularla, obtengo el error “image not found”. Sé que debe estar relacionado con un rpath y con OSX en general, pero no puedo resolver mi problema. ¡Espero que alguien pueda ayudarme! ¡Gracias!

CMakeLists.txt:

cmake_minimum_required(VERSION 3.20.0)

project(test)
add_executable(main.o main.c)

execute_process(
    COMMAND bazel build //:all
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/lyra
)

execute_process(
    COMMAND bazel info bazel-bin
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/lyra
    OUTPUT_VARIABLE LYRABINDIR
    OUTPUT_STRIP_TRAILING_WHITESPACE
)

find_library(ENCODER_LIB lyra_encoder PATHS ${LYRABINDIR})
message("Found Library at: ${ENCODER_LIB}")

target_link_libraries(main.o PUBLIC "${ENCODER_LIB}")

Output:

enter image description here

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que estás intentando incluir una biblioteca compartida construida por Bazel en tu proyecto de CMake, pero cuando intentas enlazarla, obtienes el error “imagen no encontrada”. Esto podría estar relacionado con el problema de rpath en OSX, pero es difícil decirlo sin más información.

    Algo que podrías intentar es establecer la variable de entorno “DYLD_FALLBACK_LIBRARY_PATH” para incluir la ruta de tu biblioteca compartida construida por Bazel. Esta variable le indica al enlazador dinámico dónde buscar bibliotecas compartidas si no las encuentra en las ubicaciones estándar.

    Aquí tienes una versión actualizada de tu archivo CMakeLists.txt con la configuración de “DYLD_FALLBACK_LIBRARY_PATH”:

    cmake_minimum_required(VERSION 3.20.0)
    
    project(test)
    add_executable(main.o main.c)
    
    # Construir la biblioteca con Bazel
    execute_process(
        COMMAND bazel build //:all
        WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/lyra
    )
    
    # Obtener la ruta de la biblioteca construida por Bazel
    execute_process(
        COMMAND bazel info bazel-bin
        WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/lyra
        OUTPUT_VARIABLE LYRABINDIR
        OUTPUT_STRIP_TRAILING_WHITESPACE
    )
    
    # Establecer DYLD_FALLBACK_LIBRARY_PATH para incluir la biblioteca construida por Bazel
    set(ENV{DYLD_FALLBACK_LIBRARY_PATH} ${LYRABINDIR})
    
    # Encontrar la biblioteca y enlazarla
    find_library(ENCODER_LIB lyra_encoder PATHS ${LYRABINDIR})
    message("Se encontró la biblioteca en: ${ENCODER_LIB}")
    target_link_libraries(main.o PUBLIC "${ENCODER_LIB}")
    

    Ten en cuenta que esta solución solo funciona en OSX. Si necesitas soportar otras plataformas, deberás encontrar una solución diferente para cada una.

Comments are closed.