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.

¿Cómo decide CMake si el elemento target_link_libraries es un nombre de biblioteca o un objetivo?

Tengo problemas con la función targetlinklibraries en cmake.
En mi caso, hay tres proyectos así, lo que significa que A depende de B, B depende de C

A(exec) –> B(biblioteca estática) –> C(alias de biblioteca estática C::C)

Escribo un CMakeLists.txt para B así:

find_package(C REUQIRED)
add_library(B …)
target_link_libraries(B PRIVATE C::C)

Y funciona bien, compilando con éxito.
El archivo cmake de A es así:

find_package(B REQUIRED)
add_exectuable(A …)
target_link_libraries(A B)

Reporta un error al vincular A, cmake configura un indicador de enlace “-lC::C” y luego ld dice que C::C no existe.
¿Cómo sucedió esto? Creo que C::C es un objetivo y A debería conocerlo, pero cmake cree que es un nombre de biblioteca. Y creo que A no debería saber que B depende de C, es una biblioteca privada.

No quiero escribir “find_packge(C)” en el archivo cmake de A, porque C es una biblioteca estática, creo que B debería manejar todas las dependencias de C, ¿verdad?

¿Alguien sabe cómo solucionarlo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Tengo algunos problemas con la función target_link_libraries en CMake. En mi caso, hay tres proyectos como este, donde A depende de B, y B depende de C:

    A (ejecutable) --> B (biblioteca estática) --> C (alias de biblioteca estática C::C)
    

    Escribí un CMakeLists.txt para B así:

    find_package(C REQUIRED)
    add_library(B ...)
    target_link_libraries(B PRIVATE C::C)
    

    Esto funciona bien y compila exitosamente. El archivo CMake para A se ve así:

    find_package(B REQUIRED)
    add_executable(A ...)
    target_link_libraries(A B)
    

    Al enlazar A, CMake establece una bandera de enlazador -lC::C y luego ld dice que C::C no existe. ¿Cómo sucedió esto? Creo que C::C es un objetivo y A debería conocerlo, pero CMake piensa que es un nombre de biblioteca. También creo que A no debería saber que B depende de C, ya que es una biblioteca privada.

    ¿Alguien sabe cómo arreglar esto? No quiero escribir find_package(C) en el CMake de A, porque C es una biblioteca estática y creo que B debería manejar todas las dependencias de C.

Comments are closed.