Estoy transfiriendo un proyecto de AutoTools a CMake.
Qué hace AutoTools:
Lo que he logrado hacer con CMake:
add_library(staticfoo <src>)add_library(sharedfoo SHARED <src>) y vincularlas - target_link_libraries(sharedfoo staticfoo)target_link_libraries(exe sharedfoo) , pero eso también arrastró las bibliotecas estáticas nuevamente.Entonces, el comando de enlace resultante para el ejecutable tiene bibliotecas estáticas además de compartidas. Lo cual no corresponde al comando generado por el proyecto AutoTools.
target_link_libraries(sharedfoo PRIVATE staticfoo) , pero eso no hace que los símbolos de la biblioteca estática entren en la interfaz de la biblioteca compartida.
¿Cómo obtener los símbolos sin ese comportamiento 'transitivo'?
(en forma independiente de la plataforma)
Como sé, CMake no permite mezclar bibliotecas ESTÁTICAS y COMPARTIDAS.
Si su biblioteca staticfoo se usa únicamente como parte de otras bibliotecas/ejecutables, puede definirla como
add_library(staticfoo OBJECT <src>)y úselo como una especie de fuente cuando construya otra biblioteca:
add_library(sharedfoo SHARED <src> $<TARGET_OBJECTS:staticfoo>)Para obtener más información, consulte la documentación en add_library .
Para resolver este caso, debe hacer algunas cosas:
-fPIC , de modo que contengan un código reubicable (que sería parte de una biblioteca compartida más adelante)PRIVATE <static libs> al vincular su biblioteca compartida, por lo que la línea de comando del enlazador para su ejecutable no tendría ninguna librería estática