web-dev-qa-db-fra.com

CMAKE - Comment copier correctement le fichier d'en-tête de la bibliothèque statique dans / usr / include?

Je commence à utiliser CMAKE avec C et en fait je crée deux très petites bibliothèques statiques.

Mon but est:

  1. Les bibliothèques sont compilées et liées dans des fichiers * .a. [CELA MARCHE]
  2. Ensuite, je souhaite copier ces fichiers * .a dans/usr/local/lib [CECI FONCTIONNE AUSSI]
  3. Pour autant que je sache sur les bibliothèques (très peu), elles sont liées à l'aide de -lnameoflib, qui est un indicateur de compilation. D'ACCORD. J'ai préparé mes CMakeLists.txt et il copie en fait les fichiers * .a dans /usr/local/lib. Cependant, pour pouvoir les utiliser dans un programme, je dois également copier leurs fichiers d'en-tête dans /usr/local/include, alors je peux les inclure facilement #include <mylibheader.h>. Voilà comment je le comprends maintenant.

Et ma question est - comment est la bonne façon de copier les fichiers d'en-tête dans le dossier/usr/include avec CMAKE? Je voudrais qu'il les copie automatiquement lorsque make install est exécuté, tout comme les fichiers * .a.

Pour les deux bibliothèques, j'ai un CMakeLists.txt smiliar:

project(programming-network)

add_library(programming-network STATIC
    send_string.c
    recv_line.c
    )

INSTALL(TARGETS programming-network
        DESTINATION "lib"
        )
39
Miroslav Mares

Une meilleure façon pour la dernière version de cmake est d'utiliser le PUBLIC_HEADER Propriétés.

project(myproject)

add_library(mylib some.c another.c)
set_target_properties(mylib PROPERTIES PUBLIC_HEADER "some.h;another.h")
INSTALL(TARGETS mylib 
        LIBRARY DESTINATION some/libpath
        PUBLIC_HEADER DESTINATION some/includepath
)

Quelques ref:

PUBLIC_HEADER

commande d'installation CMake

31
flm8620

De manière bien meilleure, copiera tous les fichiers qui correspondent au modèle et préservera la structure du répertoire.

INSTALL (
    DIRECTORY ${CMAKE_SOURCE_DIR}/include/
    DESTINATION include
    FILES_MATCHING PATTERN "*.h*")
13
J.Adler

Je ne pense pas que votre solution soit la bonne. /usr/include doit être réservé à votre fournisseur pour y mettre des fichiers.

La bonne chose à faire IMO est d'installer l'en-tête dans /usr/local/include, puis demandez à l'utilisateur de export CPATH="/usr/local/include:${CPATH}".

Il semble /usr/local/lib a été recherché automatiquement mais si vous souhaitez utiliser un autre répertoire export LIBRARY_PATH="/usr/local/lib:${LIBRARY_PATH}" fonctionne de manière similaire pour le binaire .a (mais peut ou peut ne pas fonctionner correctement pour les bibliothèques partagées selon votre système d'exploitation).

Facultativement, mais plus lourd consiste à ajouter -I /usr/local/include et -L /usr/local/lib lors de la compilation.

C'est une réponse quelque peu subjective, mais cela a bien fonctionné pour moi.

7
Per Johansson