CMake 标头识别:
Posted
技术标签:
【中文标题】CMake 标头识别:【英文标题】:CMake header recognition: 【发布时间】:2010-06-24 01:25:53 【问题描述】:我目前正在使用CMake构建项目,遇到以下问题:
我有一个库,比如“C”,可执行“L”的文件需要使用(L 中的文件调用 C 中库的标头)
库和可执行文件都必须在同一个项目中构建,尽管它们都可以通过 CMake,但 L 中的文件似乎看不到库 C 提供的标头。我不得不在头文件中指定到确切目标的相对路径,这一点都不好,因为某些文件层次结构可能会在某个时间点发生变化。
我不确定使用什么类型的命令来使 L 文件能够直接看到 C 标头,所以我可以说类似
#include "display.h"
直接在 L 中。我不想到处复制标题,因为我有很多像 L 这样的文件。
我的Cmake文件如图:
对于库 C(更接近文件夹层次结构的顶部):
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 的“包含”功能,但无法在线获得任何其他对我有用的东西。
最好的。
【问题讨论】:
请使用代码按钮或将每个代码行缩进 4 个空格,以便正确格式化您的源代码。 【参考方案1】:库和可执行文件都必须在同一个项目中构建,尽管它们都可以通过 CMake,但 L 中的文件似乎看不到库 C 提供的标头。我不得不在头文件中指定到确切目标的相对路径,这一点都不好,因为某些文件层次结构可能会在某个时间点发生变化。
在我自己的项目中,一行一直就足够了:
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)
【讨论】:
所以我的问题是,我的源文件分布在不同的文件夹中。如果我希望一个文件夹(在本例中为 L)中的源文件能够看到另一个文件夹中的头文件(在本例中为 C),该怎么办?最好的。 如 - 如果我按照你所说的 - 库代码中的源文件设法找到它们的标题 - 但我还需要 L 中的文件才能看到这些相同的标题。跨度>以上是关于CMake 标头识别:的主要内容,如果未能解决你的问题,请参考以下文章
使用 CMake 构建时如何使 QtCreator 识别 OpenGL 函数的自动完成功能?
如何让 CMake 在 Ubuntu 上识别 pthread?