Tengo algunos problemas con la función cmake target_link_libraries. En mi caso, hay tres proyectos como este, lo que significa que A depende de B, B depende de C
A(exec) --> B(static library) --> C(static library alias 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, cumple con éxito. El archivo cmake de A es así:
find_package(B REQUIRED) add_exectuable(A ...) target_link_libraries(AB)Informa un error al vincular A, cmake establece un indicador de vinculación "-lC::C", y luego dijo que C::C no existe. ¿Cómo sucedió? Creo que C:: C es un objetivo y A debería saberlo, pero creo 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 cmake de A, porque C es una biblioteca estática, creo que B debería manejar todas las dependencias de C, ¿no?
Entonces, ¿alguien sabe cómo solucionarlo?
Resolví este problema finalmente. En mi caso, B usa la función de C en el código de la plantilla, y B no crea una instancia de esta plantilla, por lo que C::C no se vincularía a la biblioteca estática de B. Pero A crearía una instancia de la plantilla de B, por lo que A necesita C::C, por eso La bandera PRIVADA de B era inútil.
Para ayudar a A a encontrar el C::C, debo usar find_depecncy(C) en el config.cmake de B para que A conozca la dependencia de B cuando use find_package(B).