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的目标的限制.
| 归档时间: |
|
| 查看次数: |
7849 次 |
| 最近记录: |