Maison >développement back-end >C++ >Comment puis-je fusionner plusieurs bibliothèques statiques en une seule bibliothèque à l'aide de CMake ?

Comment puis-je fusionner plusieurs bibliothèques statiques en une seule bibliothèque à l'aide de CMake ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-02 11:45:15125parcourir

How Can I Merge Multiple Static Libraries into a Single Library Using CMake?

Combiner plusieurs bibliothèques statiques en une seule bibliothèque avec CMake

Maintenir les dépendances d'un projet peut être difficile lorsqu'il s'appuie sur plusieurs bibliothèques statiques. Pour rationaliser le processus, la fusion de ces bibliothèques en une seule unité devient souhaitable. Bien que CMake fournisse des fonctionnalités pour lier des bibliothèques, il lui manque des fonctionnalités permettant de combiner directement des bibliothèques statiques.

Pour résoudre ce problème, une cible personnalisée peut être utilisée pour obtenir le résultat souhaité. En utilisant des commandes telles que ar ou libtool, les fichiers objets individuels des bibliothèques statiques peuvent être extraits et fusionnés dans une nouvelle archive. Par exemple, considérons l'extrait de code suivant :

cmake_minimum_required(VERSION 2.8.7)

add_library(b b.cpp b.h)
add_library(a a.cpp a.h)
add_executable(main main.cpp)

set(C_LIB ${CMAKE_BINARY_DIR}/libcombi.a)

add_custom_target(combined
        COMMAND ar -x $<TARGET_FILE:a>
        COMMAND ar -x $<TARGET_FILE:b>
        COMMAND ar -qcs ${C_LIB} *.o
        WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
        DEPENDS a b
        )

add_library(c STATIC IMPORTED GLOBAL)
add_dependencies(c combined)

set_target_properties(c
        PROPERTIES
        IMPORTED_LOCATION ${C_LIB}
        )

target_link_libraries(main c)

Dans cet exemple, la cible personnalisée combinée exécute les commandes nécessaires pour extraire les fichiers objets des bibliothèques a et b, puis les fusionne dans une nouvelle archive appelée libcombi.a. Cette bibliothèque combinée peut être importée dans l'exécutable principal à l'aide de la cible c.

Alternativement, la commande libtool des outils de développement d'Apple peut être utilisée à cette fin :

add_custom_target(combined
        COMMAND libtool -static -o ${C_LIB} $<TARGET_FILE:a> $<TARGET_FILE:b>
        WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
        DEPENDS a b
        )

Bien que cette approche fournisse une solution robuste, il serait avantageux d'avoir une implémentation plus native dans CMake pour combiner directement les bibliothèques statiques. Cela rationaliserait davantage le processus et éliminerait le besoin de cibles personnalisées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn