这是一个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”?有什么我不明白的吗?
target_link_libraries(otherStuff PUBLIC xyz)
是在其他地方发现的,而otherStuff本身链接到main。这是否有必要还有待观察。