我已经成功地使用target_include_directories()
将使用要求传递给了相关的C ++库。一切都很好。但这是一个稍微不同的用例。
除了普通目录(即用于C / C ++标头的目录)之外,还有其他方法可以包含第二组包含目录吗?
如果您的C ++库是由模式语言(例如Protobuf,Capnproto)生成的,并且带有
add_custom_command()
。模式文件可以通过import
相互引用,因此我想将模式文件与库一起安装。
最好将有关模式文件目录以及C ++头目录的信息传递给从属库。
使用target_include_directories()
跟踪不包含C / C ++头的目录可能是对该命令的滥用。但是也许还有其他方法可以实现这一目标?
编辑1 :
请澄清一下:我的目标是拥有两组目录路径,一组用于C ++包含头文件,另一组用于模式文件。 (模式文件和C ++头文件可能不在同一目录中)。属性INTERFACE_INCLUDE_DIRECTORIES
将处理C ++标头,但是如何处理模式文件?
yet_to_be_written_ADD_CAPNP_TARGET(
NAME target1
SCHEMA ${CMAKE_CURRENT_SOURCE_DIR}/a1.capnp
)
yet_to_be_written_ADD_CAPNP_TARGET(
NAME target2
SCHEMA ${CMAKE_CURRENT_SOURCE_DIR}/a2.capnp
DEPENDENCIES target1
)
一种解决方法是让
yet_to_be_written_ADD_CAPNP_TARGET()
创建两个库
add_library(${name}_cxx)
add_library(${name}_schema INTERFACE)
而不是一个库,因为那时我将拥有两个可以记住目录路径的INTERFACE_INCLUDE_DIRECTORIES
。 ${name}_schema
的目的只是记住架构目录路径。以后可以通过生成器表达式检索它们
$<TARGET_PROPERTY:target2_schema,INTERFACE_INCLUDE_DIRECTORIES>
并在一个目录中提供给模式编译器(/usr/bin/capnp
)
add_custom_command()
当然,如果所有架构文件都在手头的软件项目的源代码树中可用,那么整个过程就毫无意义,但是我想到的是从不同的外部软件项目中导入cmake目标的情况。模式文件可能安装在其他目录中。
另一种解决方法是直接指定外部架构目录路径(不使用目标来传递此信息)。
答案 0 :(得分:0)
当然。我自己在ProtoBuf文件研究的项目中这样做:
set(Aperture_PROTO
protoinclude/bcl.proto
protoinclude/StratusAsset.proto)
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${Aperture_PROTO})
将原始文件列为源文件,以便它们与目标一起处理:
LIST(APPEND Aperture_SRCS ${Aperture_PROTO})
确保将HEADER_FILE_ONLY
属性添加到文件组:
SET_SOURCE_FILES_PROPERTIES(${Aperture_PROTO}
PROPERTIES HEADER_FILE_ONLY TRUE)
使用source_group
获得奖励积分,在IDE中对其进行分组:
source_group("Prototype Files" FILES ${Aperture_PROTO})