Maison >développement back-end >C++ >Comment puis-je fusionner plusieurs bibliothèques statiques en une seule bibliothèque à l'aide de 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!