如何在IDE中使用CMake显示标题 - 这不是任何二进制目标的一部分?

Ad *_*d N 33 c++ ide xcode cmake header-files

在我们的工作流程,我们可以有一个模块,一个是由几个头文件,模块A不产生任何二进制(旁注:这显然会被其他模块,包括部分标题从使用模块A生成的二进制文件) .

一个很好的例子是一个只有标题的库,由于INTERFACE库的概念,CMake 3引入了很好的支持(参见这个SO答案,以及CMake的特性文档).

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

add_library(module_A INTERFACE)
Run Code Online (Sandbox Code Playgroud)

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

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

这被证明是工作流程中的主要缺点,因为我们需要在IDE中显示组成模块A的文件以进行编辑.是否有可能实现这一目标?

Ad *_*d N 23

几个月后,我没有找到直接列出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})
Run Code Online (Sandbox Code Playgroud)

我不接受这个答案,因为我希望CMake的进一步发布能够提供更加语义正确的方法,然后才能被接受:)


ste*_*ire 14

您可以target_sources在CMake 3.1中使用新命令.

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
)
Run Code Online (Sandbox Code Playgroud)

它也是传递性的.

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

对于CMake 3.3,已经解除了无法导出具有INTERFACE_SOURCES的目标的限制.

  • 这样做的意义在于标题将添加到链接到您的库的其他现有项目中,但如果您没有任何与您的库链接的项目则不起作用.因此,如果您的测试项目具有链接到INTERFACE库的可执行文件,那么此类项目将包含库标题及其源代码. (5认同)
  • 这是@FranciscoAguilera提出的一个非常好的观点.steveire,迄今为止还没有很好的解决方案吗? (3认同)