CMake:在不存在的目标“xyz”上调用 get_target_property

问题描述 投票:0回答:1

这是一个C/C++项目。我想从我的设置中排除特定的编译目标(例如“xyz”)。已经有相应的宏(例如 XYZ),我已成功将其设置为“关闭”,以便不包含源。

现在 CMake 设置不是由我完成的,而且我对 CMake 还很陌生。但我现在看到的是:

get_target_property 调用不存在的目标“xyz”

get_target_property 调用不存在的目标“xyz”

无法为目标“xyz”指定编译选项,该目标不是由此构建的

主要的 CMakeLists 有这个:

if(XYZ)
   add_subdirectory(xyz)
   target_link_libraries(main INTERFACE xyz)
endif()

这成功地没有被调用。然后目录层次结构中的一些 CMakeList(在

env
文件夹中)具有以下内容:

find_package(需要 CorePackage 配置) 包含(${CMAKE_CURRENT_LIST_DIR}/targetCompileOptions.cmake)

目标编译选项()

最后一个函数的代码可以在其他地方找到:

函数(目标编译选项) 设置(compileOptions -Werror =双提升 -Werror=不兼容的指针类型 ... )

set(uniqueTargets "")
set(parsedTargets "")

macro(getAllNotInterfaceLibs targets)
    foreach(target ${targets})
        if(${target} IN_LIST uniqueTargets OR ${target} IN_LIST parsedTargets)
            continue()
        endif()
        list(APPEND parsedTargets ${target})
        if (NOT ${target} STREQUAL "tar-NOTFOUND")
            get_target_property(type ${target} TYPE)
            if (NOT ${type} STREQUAL "INTERFACE_LIBRARY")
                list(APPEND uniqueTargets ${target})
                get_target_property(tar ${target} LINK_LIBRARIES)
                getAllNotInterfaceLibs("${tar}")
            else()
                get_target_property(tar ${target} INTERFACE_LINK_LIBRARIES)
                getAllNotInterfaceLibs("${tar}")
            endif()
        endif()
    endforeach()
endmacro()

getAllNotInterfaceLibs(main)

list(REMOVE_DUPLICATES uniqueTargets)

foreach(target ${uniqueTargets})
    target_compile_options(${target} PRIVATE ${compileOptions})
endforeach()

结束函数()

所以这个函数似乎需要一个目标,获取链接目标的列表,删除重复项,然后在剩下的目标上应用一些我们喜欢的编译选项。

在调用

targetCompileOptions
CMakeLists 中的
env
函数时出现错误。

我是否应该在我的代码中查找仍然(并且错误地,现在我已停用它)引用“xyz”并将其链接到主要目标的地方?除了

target_link_libraries
之外,还有哪些方式仍然可以引用和链接“xyz”?有什么我不明白的吗?

cmake cmakelists-options cmake-language
1个回答
0
投票

target_link_libraries(otherStuff PUBLIC xyz)
是在其他地方发现的,而otherStuff本身链接到main。这是否有必要还有待观察。

© www.soinside.com 2019 - 2024. All rights reserved.