使用可重定位代码的 CUDA 编译:"Could not find fatbin in ..."

CUDA compilation with relocatable code: "Could not find fatbin in ..."

作为更大的 CMake 项目的一部分,我正在添加一个 CUDA 库。项目的其余部分是 C++,用 clang 编译。

为了测试库是否正常工作,我正在创建一个小的可执行文件并将 CUDA 库链接到它:

add_library(kernels STATIC
    kernels.cu
)
set_target_properties(kernels PROPERTIES CUDA_SEPARABLE_COMPILATION ON)

# --- Test executable
add_executable(main
    main.cpp
)
target_link_libraries(main PRIVATE kernels)

库编译正常,但是当调用 nvcc 来执行我的可执行文件(目标 main)上的设备链接部分过程时,我收到以下错误:

nvlink fatal   : Could not find fatbin in '[some long path]/main.cpp.o'
nvlink fatal   : elfLink internal error

是什么阻止了这一步的工作?

我无法在一个新的小型 CMake 项目中重现这个问题,所以我最终发现我的较大项目中的某些标志没有发挥作用。

事实证明,在 CMAKE_CXX_FLAGS 中启用的精简 LTO 导致了此问题。 我为这个特定目标禁用了它:

target_compile_options(main PRIVATE "-fno-lto")