我想遍历目标target
的所有链接库,以构建target
链接到的所有库二进制文件(静态库)的列表,例如:
add_executable(exe main.cpp)
target_link_libraries(exe fmt::fmt otherExe)
字符串
我们想要一个所有库二进制文件的列表(通过使用$<TARGET_LINKER_FILE:tgt>
)为依赖目标fmt::fmt
和otherExe
生成适当的CGO interface.go
文件与CFLAGS
和LDFLAGS
。
问题是,很难在CMake中编写一个循环来消除target
的链接依赖关系,因为像LINK_LIBRBARIES
和INTERFACE_LINK_LIBRARIES
这样的属性在一般列表中,但可能包含生成器表达式,就像来自Conan的接口库目标fmt::fmt
的情况一样,其中INTERFACE_LINK_LIBRARIES
解析为$<$<CONFIG:Release>:CONAN_LIB::fmt_fmt_RELEASE;>
。“,然后将其本身视为具有$<$<CONFIG:Release>:CONAN_LIB::fmt_fmt_RELEASE;
和>
的列表。
这是由于柯南增加了以下内容
set_property(TARGET fmt::fmt
PROPERTY INTERFACE_LINK_LIBRARIES
$<$<CONFIG:Release>:${fmt_LIBRARIES_TARGETS_RELEASE}
${fmt_OBJECTS_RELEASE}> APPEND)
型
我该怎么解决这个问题?
1条答案
按热度按时间xytpbqjk1#
我们通过使用Cmake的file-api找到了一个解决方案,我们在Cmake中设置了一个“configure”
add_custom_target
,这是一个pyhton脚本,它阅读“codemodel-v2”(file-api)的回复:解析JSON输出文件以找到感兴趣的目标。然后从这个JSON中收集所有链接器和编译器标志,然后用这些标志配置一个Go文件。通过将
$<TARGET_PROPERTY:targetName,INCLUDE_DIRECTORIES>
传递到add_custom_command
,已提取包含文件。