CMake调用find_package引入库时提示私有CUDA依赖目标未找到如何解决
问题根源
你遇到的报错核心是CUDA_SEPARABLE_COMPILATION ON配置导致的隐式依赖传递:CMake的CUDA模块开启 separable compilation 后,会自动为你的库添加CUDA::toolkit的隐式接口依赖,哪怕你显式将CUDA相关依赖设为PRIVATE链接,这个依赖依然会被写入你导出的MyLibraryConfig.cmake中。而你当前的库安装配置没有在导出的Config文件中加入CUDA查找逻辑,导致下游项目加载你的库配置时找不到CUDA::toolkit目标。
正确解决方法
核心思路是在库的CMake配置中,将CUDA依赖查找逻辑嵌入到导出的Config文件里,下游项目调用find_package(MyLibrary CONFIG)时会自动完成依赖查找,无需感知CUDA依赖。具体修改步骤如下:
1. 为库项目添加Config模板文件
在库项目根目录下创建cmake/MyLibraryConfig.cmake.in模板文件,内容如下:
include(CMakeFindDependencyMacro) # 自动查找和你库编译版本匹配的CUDAToolkit find_dependency(CUDAToolkit REQUIRED) # 加载库的导出目标 include("${CMAKE_CURRENT_LIST_DIR}/MyLibraryConfigTargets.cmake")
2. 修改库项目的安装配置逻辑
替换你原有的安装配置部分代码,引入CMakePackageConfigHelpers模块生成标准的Config文件,修改后完整的安装配置如下:
###### 安装配置 ##### include(GNUInstallDirs) include(CMakePackageConfigHelpers) # 安装库文件和头文件 install(TARGETS MyLibrary EXPORT MyLibraryConfig PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/MyLibrary ) # 导出构建目录的目标文件 export( TARGETS MyLibrary NAMESPACE MyLibrary:: FILE "${CMAKE_CURRENT_BINARY_DIR}/MyLibraryConfigTargets.cmake" ) # 生成Config.cmake文件 configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/MyLibraryConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/MyLibraryConfig.cmake" INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/MyLibrary" ) # 可选:生成版本兼容校验文件,替换为你库的实际版本号 write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/MyLibraryConfigVersion.cmake" VERSION 1.0.0 COMPATIBILITY SameMajorVersion ) # 安装Config和Version文件 install( FILES "${CMAKE_CURRENT_BINARY_DIR}/MyLibraryConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/MyLibraryConfigVersion.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/MyLibrary" ) # 安装导出的目标文件 install(EXPORT MyLibraryConfig DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/MyLibrary" NAMESPACE MyLibrary:: FILE MyLibraryConfigTargets.cmake )
3. 重新编译安装库
修改完成后重新编译安装库,下游可执行项目不需要做任何修改,直接调用find_package(MyLibrary CONFIG)即可自动完成所有传递依赖的加载,不会再报CUDA::toolkit找不到的错误。
内容的提问来源于stack exchange,提问作者Siech0
相关产品推荐
相关产品推荐

