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)

这是您需要同时使用includesomelibrary/include 的唯一行:

include_directories(include somelibrary/include)

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

include_directories(../include ../somelibrary/include)

【讨论】:

所以我的问题是,我的源文件分布在不同的文件夹中。如果我希望一个文件夹(在本例中为 L)中的源文件能够看到另一个文件夹中的头文件(在本例中为 C),该怎么办?最好的。 如 - 如果我按照你所说的 - 库代码中的源文件设法找到它们的标题 - 但我还需要 L 中的文件才能看到这些相同的标题。跨度>

以上是关于CMake 标头识别:的主要内容,如果未能解决你的问题,请参考以下文章

如何识别生成警告的标头?

cmake跨平台对编译器的准确识别

使用 CMake 构建时如何使 QtCreator 识别 OpenGL 函数的自动完成功能?

如何让 CMake 在 Ubuntu 上识别 pthread?

将vscode打造成无敌的IDE(11) vscode增加文件后缀类型的支持,例如cmake支持识别cmake.in

在 CMake 项目中找不到 spdlog.h