Cmake CUDA编译,带可重定位代码;在…中找不到fatbin“;

Cmake CUDA编译,带可重定位代码;在…中找不到fatbin“;,cmake,cuda,nvcc,Cmake,Cuda,Nvcc,作为一个更大的CMake项目的一部分,我正在添加一个CUDA库。该项目的其余部分是C++,用CLAN./P>编译。 为了测试库是否正常工作,我创建了一个小的可执行文件,并将CUDA库链接到它: add_library(kernels STATIC kernels.cu ) set_target_properties(kernels PROPERTIES CUDA_SEPARABLE_COMPILATION ON) # --- Test executable add_executable

作为一个更大的CMake项目的一部分,我正在添加一个CUDA库。该项目的其余部分是C++,用CLAN./P>编译。 为了测试库是否正常工作,我创建了一个小的可执行文件,并将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
在我的可执行文件(target
main
)上执行进程的设备链接部分时,我遇到以下错误:


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

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

原来是在
CMAKE\u CXX\u标志中启用的瘦LTO导致了这个问题。
我通过以下方式禁用了此特定目标的功能:

target_compile_options(main PRIVATE "-fno-lto")

nvlink fatal:在“[some long path]/main.cpp.o”中找不到fatbin
——在.cpp文件中不可能有一个fatbin文件,只有当您将.cu文件编译成一个对象,或者如果您采取了一些谨慎的步骤,使用nvcc在.cpp文件中编译CUDA代码时才会出现这种情况,我看不到任何证据。我猜您的项目的编译结构中有严重的缺陷,或者您的CMake安装很旧或陈旧
target_compile_options(main PRIVATE "-fno-lto")