CMake: la Statique et la liaison dynamique basée sur BUILD_TYPE
Je suis en train d'élaborer un petit logiciel de simulation qui dépend de deux bibliothèques, la GSL et la libconfig. Comme un système de build, j'utilise CMake. Pour la GSL et libconfig, j'ai trouvé cmake fichiers et copiées dans le cmake/
répertoire de mon projet.
Le scénario est le suivant: je veux avoir plusieurs différents types, comme les debug
, release
, etc., mais aussi un programme personnalisé appelé cluster
, qui ajoute -static
à la CCG des drapeaux et des liens à l'encontre de la .a
bibliothèques de la GSL et la libconfig, qui, je suppose exister.
Mon CMakeLists.txt
ressemble à ça pour l'instant:
# version
SET(PACKAGE_VERSION "1.0")
SET(PACKAGE_NAME "INTERFACE")
PROJECT(interface C CXX)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
# dirs -----------------------------------------------------
SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
FIND_PACKAGE(GSL REQUIRED)
INCLUDE_DIRECTORIES(${GSL_INCLUDE_DIRS})
SET(LIBS ${LIBS} ${GSL_LIBRARIES})
FIND_PACKAGE(LibConfig REQUIRED)
INCLUDE_DIRECTORIES(${LIBCONFIG_INCLUDE_DIRS})
SET(LIBS ${LIBS} ${LIBCONFIG_LIBRARIES})
CONFIGURE_FILE("res/config.h.in" "config.h")
INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR})
SET_DIRECTORY_PROPERTIES(PROPERTIES
ADDITIONAL_MAKE_CLEAN_FILES "config.h"
)
# compilation ----------------------------------------------
ADD_EXECUTABLE( interface
interface.c interface.h config.h
helpers.c
output.c
lattice.c
genetic.c
)
# optional CFLAGS
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -pedantic -std=c99")
SET(CMAKE_C_FLAGS_RELEASE "-O3 -ffast-math")
SET(CMAKE_C_FLAGS_CLUSTER "-O3 -ffast-math -static")
SET(CMAKE_C_FLAGS_DEBUG "-g")
SET(CMAKE_C_FLAGS_PROFILE "-g -ffast-math -pg")
TARGET_LINK_LIBRARIES(interface m ${LIBS})
# installation --------------------------------------------
INSTALL(TARGETS interface DESTINATION bin)
Cela s'ajoute la -static
pour le compilateur, lorsque j'utilise -DCMAKE_BUILD_TYPE=cluster
. Le truc c'est qu'il relie encore à l'encontre de la .so
versions des libs, ce qui provoque la gcc de générer des erreurs. Au moins la FindLibConfig.cmake
scripts définit à la fois un LIBCONFIG_LIBRARY
et un LIBCONFIG_STATIC_LIBRARY
variable, que je pourrais utiliser.
Ce qui est le plus élégant, ou de manière intelligente pour atteindre mon objectif?
Vous devez vous connecter pour publier un commentaire.
Selon cmake la documentation, cmake utilise la variable BUILD_SHARED_LIBS pour déterminer la valeur par défaut pour add_library().
Si vous réglez SUR cmake assumera tous les
add_library()
appel sera commePar exemple quelque chose comme-DBUILD_SHARED_LIBS=SUR la ligne de commande de cmake peut faire ce que vous demandez.
Je l'ai résolu comme ceci:
L'Utilisateur peut spécifier une variable supplémentaire
-DSTATIC_LINKING=TRUE
. Ensuite, le script ressemble à ceci. (Que les parties importantes pour la liaison statique et de la compilation sont affichés!)