2011-07-05 5 views
1

Je développe un framework sous la forme d'une librairie partagée (sous Linux). Un utilisateur a demandé une version statique de la bibliothèque. J'utilise cmake et donc juste commuté BUILD_SHARED_LIBS à OFF. J'ai fini avec une bibliothèque statique comme prévu.Comment produire une bibliothèque statique "autonome"?

Cependant, l'utilisateur s'est plaint qu'il doit maintenant lier avec boost et hdf5 qui sont des dépendances de ma bibliothèque.

Pensez-vous que je dois agir pour éviter cette situation? Ou est-ce normal? Est-il possible de fournir une bibliothèque sans dépendance?

EDIT: Est-ce que je devrais faire quelque chose comme extraire les fichiers d'objets des bibliothèques statiques boost et hdf5 et les ajouter en construisant le mien?

Répondre

3

Le coup de pouce » solution est:

set(Boost_USE_STATIC_LIBS ON) 
set(Boost_USE_STATIC_RUNTIME ON) # it may help 
find_package(Boost REQUIRED ...) 

Pour hdf5, vous pouvez essayer quelque chose comme ça.

  1. Trouvez la bibliothèque statique HDF avec FIND_LIBRARY
  2. Copiez la bibliothèque statique dans un répertoire dans l'arbre de construction avec

    EXEC_PROGRAM(${CMAKE_COMMAND} -E copy_if_different ${HDF_LIB} ${PROJECT_BINARY_DIR}/HDFStaticLib)

  3. Ajoutez le répertoire de liens pour HDFStaticLib d'abord avec

    LINK_DIRECTORIES(${PROJECT_BINARY_DIR}/HDFStaticLib)

  4. Ajouter la bibliothèque comme ceci:

    TARGET_LINK_LIBRARIES(foo ${PROJECT_BINARY_DIR}/HDFStaticLib/HDF)

Encore une chose: vous devriez avoir renommé API.a à libAPI.a, si le nom de fichier ne démarre pas par lib.

+0

Merci pour votre réponse. J'ai essayé la solution boost, mais ça n'a pas aidé. Lors de la liaison d'un binaire avec mon framework, je dois encore spécifier la bibliothèque boost qui n'est pas le cas lorsque mon framework est distribué en tant que bibliothèque partagée. J'ai peut-être mal compris ce que vous avez proposé. – Barth

+0

@Barth: [théoriquement bon. :)] (http://cmake.org/cmake/help/cmake-2-8-docs.html#module:FindBoost) 'SET (Boost_USE_STATIC_RUNTIME ON)' peut aider. – Naszta

Questions connexes