2010-06-24 43 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