Распознавание заголовка CMake: - PullRequest
3 голосов
/ 24 июня 2010

В настоящее время я использую 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, развене могу получить что-либо еще в Интернете, что бы мне помочь.

Бест.

1 Ответ

6 голосов
/ 24 июня 2010

И библиотека, и исполняемый файл должны быть встроены в один и тот же проект, и хотя они оба проходят через CMake нормально, файлы в L не могут видеть заголовки, предоставленные библиотекой C. I 'Мне приходится указывать относительные пути к точному месту назначения в заголовочных файлах, что совсем нехорошо, поскольку некоторая файловая иерархия может измениться в какой-то момент времени.

В моих собственных проектах одна строкавсегда было достаточно:

include_directories(include)

(где include относительно каталога, в котором находится файл CMakeLists.txt.) И все мои исходные файлы в src могут найти свои заголовки в include.Указывать полный текущий путь к источнику никогда не было необходимости.

Редактировать: Например, предположим, у вас есть проект с этим макетом:

proj
    /src
    /include
    /somelibrary/include

И в proj /, у вас естьCMakeLists.txt файл, который ссылается на ваши исходные файлы следующим образом:

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

Это единственная строка, которую вам нужно использовать как include и somelibrary/include:

include_directories(include somelibrary/include)

Или, если CMakeLists.txt находится в src, например:

include_directories(../include ../somelibrary/include)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...