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

C++ 如何让CMake显示不属于IDE中任何二进制目标的头文件?,c++,xcode,ide,cmake,header-files,C++,Xcode,Ide,Cmake,Header Files,在我们的工作流程中,我们可以有一个由多个头文件组成的模块a,模块a不生成任何二进制文件(旁注:它显然会被其他模块使用,其中包括模块a中的一些头文件以生成二进制文件) 一个很好的例子是仅头部的库,由于接口库的概念,CMake 3为其引入了良好的支持(请参阅和CMake的) 我们可以从模块A中创建接口库目标: 这为我们提供了CMakes目标的所有优秀特性(可以将其用作另一个目标的依赖项、导出它、传递转发需求等) 但在本例中,模块A中的头不会显示在我们的IDE中(Xcode,但我们希望它与大多数/每一

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

一个很好的例子是仅头部的库,由于
接口
库的概念,CMake 3为其引入了良好的支持(请参阅和CMake的)

我们可以从模块A中创建接口库目标:

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

但在本例中,模块A中的头不会显示在我们的IDE中(Xcode,但我们希望它与大多数/每一个其他IDE相同)


这被证明是工作流中的一个主要缺点,因为我们需要在IDE中显示组成模块a的文件以供编辑。有可能做到这一点吗?

几个月后,我没有找到直接列出
接口
库头文件的方法

由于这个问题仍然有一些观点,下面是我最后做的事情(即,看起来像是目前可用的较小的黑客)

假设模块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的进一步版本能够提供一种语义上更正确的方法,这将被接受:)

您可以在CMake 3.1中使用新的
target\u 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
)
它也是及物的


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

Ah删除了我的评论。好问题。@IdeaHat谢谢你对这个问题的兴趣和建议。遗憾的是,
add_library
命令的
接口
形式不需要任何文件参数(请参阅)。事实上,我们不一定需要
接口
,但这是我们知道的唯一可变的非二进制目标。[在上下文中,IdeaHat想知道我们是否可以以
界面
的形式向
add_library
命令提供头文件]一种黑客方法是使用这些文件作为源创建一个虚拟自定义目标(从未构建,或没有构建步骤),以供我个人学习,你与CMake对可变的定义有联系吗?@IdeaHat我会研究这种方法,同意这是一种很有技巧的方法;)关于目标可变性的概念,我在文档中没有找到定义,但从中推断,我的猜测是:可变目标可以(至少部分)写入其属性。[其中一些是指“白名单”属性的概念,例如限制可以在
接口上写入哪些属性。
]在功能请求下捕获了这些属性,这在某种意义上是有效的,即标题将添加到链接到库的其他现有项目中,但如果您没有任何项目链接到您的库,则不起作用。因此,如果您有一个带有链接到接口库的可执行文件的测试项目,那么这样的项目将包含库头及其源代码。steveire,到目前为止还没有很好的解决方案吗?我知道已经有一段时间了,但我不确定我是否完全理解你的评论@FranciscoAguilera。第一句话“这项工作的意义是,标题将被添加到链接到您的库的其他现有项目中。”我理解这是一个积极的情况,它将按预期工作。第二句话“如果您没有任何项目链接到您的库,则无法正常工作”?这部分我不明白。对于编译独立的IMO来说,只有标题的库没有多大意义。那么关于测试项目的最后一句话:这是指第一句还是第二句?我一直在寻找一种方法来实现这一点,而你的解决方案最终让我通过了。谢谢
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
)