CMake报错:无法为非本地目标指定链接库的解决求助
解决方案
方法1:启用CMAKE_TARGET_LINK_LIBRARIES_ADMINISTRATIVE_MODE(CMake 3.24+)
在find_package(foo REQUIRED)之前添加以下代码:
set(CMAKE_TARGET_LINK_LIBRARIES_ADMINISTRATIVE_MODE ON)
该选项允许CMake修改IMPORTED目标的INTERFACE链接属性,直接让libfoo中的target_link_libraries命令合法执行。
方法2:提前处理CUDA目标(兼容低版本CMake)
如果你的CMake版本低于3.24,可在引入libfoo前手动创建并包装CUDA目标:
find_package(CUDAToolkit REQUIRED) find_package(Threads REQUIRED) if(CUDAToolkit_VERSION VERSION_GREATER_EQUAL 11.1) _CUDAToolkit_find_and_add_import_lib(nvptxcompiler_static) # 将原IMPORTED目标转换为本项目可修改的INTERFACE库 add_library(CUDA::nvptxcompiler_static INTERFACE IMPORTED GLOBAL) # 继承原目标的属性并提前添加Threads依赖 get_target_property(_nvptx_inc CUDA::nvptxcompiler_static INTERFACE_INCLUDE_DIRECTORIES) get_target_property(_nvptx_lib CUDA::nvptxcompiler_static INTERFACE_LINK_LIBRARIES) target_include_directories(CUDA::nvptxcompiler_static INTERFACE ${_nvptx_inc}) target_link_libraries(CUDA::nvptxcompiler_static INTERFACE ${_nvptx_lib} Threads::Threads) endif()
当libfoo执行时,CUDA::nvptxcompiler_static已变为本项目可操作的目标,不会触发报错。
方法3:跳过报错命令(仅应急使用)
若上述方法均不可行,可临时覆盖target_link_libraries宏,跳过对CUDA::nvptxcompiler_static的修改:
# 在find_package(foo)前定义临时宏 macro(target_link_libraries target) if(NOT target STREQUAL "CUDA::nvptxcompiler_static") _target_link_libraries(${target} ${ARGN}) endif() endmacro() find_package(foo REQUIRED) # 恢复原命令 undefine_macro(target_link_libraries)
注意:此方法可能导致libfoo的依赖处理不完整,仅在无其他方案时使用。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

