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.

msvc y cmake enlazan completamente una biblioteca estática con otras bibliotecas estáticas (paquete)

Actualmente estoy intentando construir mi propia pequeña biblioteca gráfica que también utiliza imgui internamente y quiero distribuir esta única biblioteca estática (/MT para la versión final y /MTd para la depuración).

¿Cómo puedo enlazar completamente imgui a mi librería de modo que no tenga que enlazar imgui con el ejecutable también cuando enlace mi biblioteca a una aplicación?

Básicamente, me gustaría agrupar mi biblioteca (que depende de imgui) y imgui en una sola librería.

Actualmente solo estoy utilizando target_link_libraries() de la siguiente manera:

# Establecer objetivos
add_library(final_lib STATIC ........cpp)

# Añadir dependencias
find_package(fmt CONFIG REQUIRED)
find_package(imgui CONFIG REQUIRED)

target_link_libraries(final_lib PUBLIC fmt::fmt imgui::imgui)

¿Hay alguna manera de agrupar fmt, imgui en final_lib?

Saludos, Artur

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una manera de agrupar fmt e imgui en final_lib. Puedes lograr esto creando un nuevo objetivo de CMake que se enlace con fmt e imgui, y luego agregando este objetivo como una dependencia de final_lib. Aquí tienes un ejemplo:

    # Establecer objetivos
    add_library(imgui STATIC ...)
    add_library(final_lib STATIC ...)
    add_library(final_lib_with_deps STATIC ...)
    
    # Agregar dependencias
    find_package(fmt CONFIG REQUIRED)
    find_package(imgui CONFIG REQUIRED)
    
    # Enlazar imgui con final_lib_with_deps
    target_link_libraries(final_lib_with_deps PUBLIC imgui::imgui)
    
    # Enlazar fmt con final_lib_with_deps y final_lib
    target_link_libraries(final_lib_with_deps PUBLIC fmt::fmt)
    target_link_libraries(final_lib PRIVATE fmt::fmt)
    
    # Agregar final_lib_with_deps como una dependencia de final_lib
    target_link_libraries(final_lib PUBLIC final_lib_with_deps)
    

    En este ejemplo, creamos un nuevo objetivo de CMake llamado final_lib_with_deps que se enlaza tanto con fmt como con imgui. Luego agregamos este objetivo como una dependencia de final_lib, lo que hace que se construya y enlace automáticamente cuando se construye final_lib.

    Al hacer esto, puedes distribuir final_lib como una única biblioteca estática que incluye tanto imgui como fmt, y los usuarios de tu biblioteca no necesitarán enlazar con estas bibliotecas por separado.

Comments are closed.