如何让 CMake 在 IDE 中显示不属于任何二进制目标的标头?

问题描述 投票:0回答:2

在我们的工作流程中,我们可以有一个由多个头文件组成的模块A模块A不生成任何二进制文件(旁注:它显然会被其他模块使用,其中包括来自的一些标头模块 A 生成二进制文件)。

一个很好的例子是纯头文件库,由于

INTERFACE
库的概念,CMake 3 为其引入了良好的支持(请参阅 this SO 答案,以及 CMake 的该功能的文档)。

我们可以从模块A中制作一个接口库目标:

add_library(module_A INTERFACE)

这为我们提供了 CMake 目标的所有优秀功能(可以将其用作另一个目标的依赖项、导出它、传递转发需求等)

但是在这种情况下,模块 A 中的标头不会显示在我们的 IDE 中(Xcode,但我们希望它与大多数/所有其他 IDE 相同)。

这被证明是工作流程中的一个主要缺点,因为我们需要在 IDE 中显示组成 module A 的文件进行编辑。有可能实现吗?

c++ xcode ide cmake header-files
2个回答
25
投票

几个月来,我没有找到直接列出

INTERFACE
库的头文件的方法。

由于这个问题仍然有一些观点,这就是我最终所做的(即目前可用的较小的黑客)。

想象一下 模块 A 是一个仅包含头文件的库。在 CMakeLists.txt 中声明其目标:

# Define 'modA_headers' variable to list all the header files
set(modA_headers 
  utility.h
  moreUtilities.h
  ...)

add_library(moduleA INTERFACE) # 'moduleA' is an INTERFACE pseudo target

#
# From here, the target 'moduleA' can be customised
#
target_include_directories(moduleA ...) # Transitively forwarded
install(TARGETS moduleA ...)

#
#  HACK: have the files showing in the IDE, under the name 'moduleA_ide'
#
add_custom_target(moduleA_ide SOURCES ${modA_headers})

我不接受这个答案,因为我希望 CMake 的进一步版本能够提供语义上更正确的方法,然后该方法将被接受:)


16
投票

您可以使用 CMake 3.1 中新的

target_sources
命令。

add_library(moduleA INTERFACE)
target_include_directories(moduleA INTERFACE ...)
target_sources(moduleA INTERFACE 
  ${CMAKE_CURRENT_SOURCE_DIR}/utility.h
  ${CMAKE_CURRENT_SOURCE_DIR}/moreUtilities.h
)

它也是传递性的。

http://www.cmake.org/cmake/help/v3.1/command/target_sources.html#command:target_sources

CMake 3.3 取消了无法导出具有 INTERFACE_SOURCES 的目标的限制。

© www.soinside.com 2019 - 2024. All rights reserved.