2010-06-24 5 views
3

J'utilise actuellement CMake pour construire un projet, et j'ai le problème suivant:CMake reconnaissance d'en-tête:

J'ai une bibliothèque, dire « C », que les fichiers pour un exécutable « L » doivent use (les fichiers de l'appel L sur les en-têtes de la bibliothèque en C)

La bibliothèque et l'exécutable doivent tous deux être construits dans le même projet, et bien qu'ils passent tous les deux par CMake, les fichiers dans L ne peuvent pas semblent voir les en-têtes fournis par la bibliothèque C. Je dois spécifier des chemins relatifs à la destination exacte dans les fichiers d'en-tête, ce qui n'est pas bien du tout puisque la hiérarchie des fichiers pourrait changer à un moment donné.

Je ne suis pas sûr de ce type d'une commande à utiliser pour rendre les fichiers L directement être en mesure de voir les en-têtes C, afin que je puisse dire quelque chose comme

#include "display.h" 

directement dans L. I ne veulent pas avoir à copier les en-têtes dans tous les sens depuis que j'ai beaucoup de fichiers comme L.

Mes fichiers cMake sont indiqués:

pour la bibliothèque C (qui est plus proche de la partie supérieure du dossier hiérarchie):

FIND_PACKAGE(VTK REQUIRED) 
IF(NOT VTK_USE_RENDERING) 
    MESSAGE(FATAL_ERROR "Example ${PROJECT_NAME} requires VTK_USE_RENDERING.") 
ENDIF(NOT VTK_USE_RENDERING) 
INCLUDE(${VTK_USE_FILE}) 

#INCLUDE_DIRECTORIES(${CRANIOLIB_SOURCE_DIR}/include) 

SET(cranioDir ${CMAKE_CURRENT_SOURCE_DIR}) 
SET(SOURCES 
twoD.cxx 
display.cxx 
rotate.cxx 
symmetry.cxx 
normalize.cxx 
real_sym_eigens.cxx 
debugLib.cxx 
readInputLib.cxx) 
SET(cranioLib_INCLUDE_DIRS ${CMAKE_INSTALL_PREFIX}/include) 
ADD_LIBRARY(cranioLib ${SOURCES}) 

et pour l'exécutable L:

FIND_PACKAGE(VTK REQUIRED) 
IF(NOT VTK_USE_RENDERING) 
    MESSAGE(FATAL_ERROR "Example ${PROJECT_NAME} requires VTK_USE_RENDERING.") 
ENDIF(NOT VTK_USE_RENDERING) 
INCLUDE(${VTK_USE_FILE}) 

INCLUDE_DIRECTORIES(${cranioDir}) 

ADD_EXECUTABLE(RotateSS RotateSideToSide.cxx) 
TARGET_LINK_LIBRARIES(RotateSS vtkRendering cranioLib vtkHybrid vtkGraphics) 

ADD_EXECUTABLE(RotateST RotateSideTwist.cxx) 
TARGET_LINK_LIBRARIES(RotateST vtkRendering cranioLib vtkHybrid vtkGraphics) 

ADD_EXECUTABLE(RotateUD RotateUpDown.cxx) 
TARGET_LINK_LIBRARIES(RotateUD vtkRendering cranioLib vtkHybrid vtkGraphics) 

Notez que ces fichiers ne sont pas tout à fait faire le travail - j'ai besoin d'aide pour clouer les caractéristiques include de CMake, n'a pas été en mesure d'obtenir rien d'autre en ligne qui ferait l'affaire pour moi.

Meilleur.

+0

S'il vous plaît utiliser le bouton de code ou en retrait chaque ligne de code 4 places donc il va formater la source correctement. – greyfade

Répondre

6

La bibliothèque et l'exécutable doivent tous deux être construits dans le même projet, et bien qu'ils passent tous les deux par CMake, les fichiers dans L ne semblent pas voir les en-têtes fournis par la bibliothèque C. I ' Je dois spécifier des chemins relatifs à la destination exacte dans les fichiers d'en-tête, ce qui n'est pas bien du tout, car une certaine hiérarchie de fichiers peut changer à un moment donné.

Dans mes propres projets, une ligne a toujours été suffisante:

include_directories(include) 

(Où include est relatif au répertoire du fichier CMakeLists.txt réside.) Et tous mes fichiers source dans src peut trouver leurs en-têtes au include. Il n'a jamais été nécessaire de spécifier le chemin source complet.

Edit: Par exemple, disons que vous avez un projet avec cette mise en page:

proj 
    /src 
    /include 
    /somelibrary/include 

Et dans/proj, vous disposez d'un fichier CMakeLists.txt qui fait référence à vos fichiers source comme ceci:

SET(SOURCES src/file1.cpp src/file2.cpp) 

Ceci est la seule ligne que vous devez utiliser à la fois include et somelibrary/include:

include_directories(include somelibrary/include) 

Ou, si CMakeLists.txt est en src, comme ceci:

include_directories(../include ../somelibrary/include) 
+0

Donc, mon problème est, que mes fichiers source sont répartis dans différents dossiers. Et si je voulais que les fichiers sources d'un dossier (dans ce cas L) puissent voir les fichiers d'en-tête dans un autre (C, dans ce cas)? Mieux. –

+0

Comme dans - si je suis ce que vous dites - les fichiers source dans le code de la bibliothèque parviennent à trouver leurs en-têtes - mais j'ai aussi besoin des fichiers dans L pour pouvoir voir ces mêmes en-têtes. –

+0

@Ambar C: Voir modification. – greyfade