2010-06-24 61 views
3

我目前使用的CMake构建一个项目,我有以下问题:CMake的头识别:

我有一个图书馆,说“C”,对于一个可执行的“L”的文件需要使用(L中的文件调用C中库中的头文件)

库和可执行文件都必须在同一个项目中构建,虽然它们都通过CMake很好,但L中的文件不能似乎看到由库C提供的头文件。我不得不在头文件中指定确切目标的相对路径,这根本不好,因为某些文件层次结构可能在某个时间点发生更改。

我不知道使用什么类型的命令,使将L文件直接能看到的C头文件,这样我可以这样说

#include "display.h" 

直接L.我不希望有复制标题所有的地方,因为我有很多文件,如L.

我的CMake文件,如下所示:

对于库C(这是更接近文件夹顶部heirarchy):

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}) 

和可执行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) 

注意,这些文件没有完全做的工作 - 我需要钉“包括” CMake的特点一定的帮助,是不是能够得到网上其他任何会为我做诡计的网站。

最好。

+0

请使用代码按钮或缩进各代码行4个空格所以它会正确地格式化源。 – greyfade 2010-06-24 01:44:16

回答

6

库和可执行文件都必须在同一个项目中构建,尽管它们都经过了CMake,但L中的文件似乎无法看到库C提供的头文件。 m必须指定头文件中确切目标的相对路径,因为某些文件层次结构可能在某个时间点发生更改,所以这并不好。

在我自己的项目,一条线一直是足够的:

include_directories(include) 

(其中include相对于CMakeLists.txt文件所在的目录)。而且我所有的源文件src可以找到他们的标题在include。指定完整的电流源路径从来没有必要。

编辑:例如,假设你有这种布局的项目:

proj 
    /src 
    /include 
    /somelibrary/include 

而且在凸出/,你有一个CMakeLists.txt文件引用,像这样你的源文件:

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

这是你需要使用的唯一线路都includesomelibrary/include

include_directories(include somelibrary/include) 

或者,如果CMakeLists.txtsrc,像这样:

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

所以我的问题是,我的源文件分散在不同的文件夹。如果我想让一个文件夹中的源文件(在本例中为L)能够在另一个文件夹(C中,在这种情况下)中看到头文件? 最好。 – 2010-06-24 01:52:40

+0

正如 - 如果我遵循你所说的话 - 图书馆代码中的源文件设法找到它们的标题 - 但我还需要L中的文件才能看到相同的标题。 – 2010-06-24 02:01:25

+0

@Ambar C:见编辑。 – greyfade 2010-06-24 04:13:07