【发布时间】:2020-04-12 21:32:41
【问题描述】:
我正在使用 MSVC 将 GPU 应用程序移植到 Windows,这似乎与 NVCC 不太兼容。我已经分离了编译和链接阶段。 nvcc 将只预处理 cuda 文件:
nvcc -dc -ccbin cl somefile.cu
而cl 将编译其他所有内容:
cl anotherfile.c
这种分离是必要的,因为许多 MSVC 标志(此处不包括)与 nvcc 对 cl.exe 的包装不兼容(相关症状 here)。
编译完成后,我可以通过两种方式进行链接。
- 使用
nvcc链接仅 CUDA 设备代码,然后使用link.exe链接所有内容,按照this guide。
尽我所能,我无法让link 找到 CUDA 标头,也找不到任何有关如何将link 指向cudart 库的文档。要是像他们的 g++ 例子一样简单就好了!
- 让
nvcc完成所有链接。
然而,根据doc,“没有选项”可以跳转到链接阶段。因此,当我尝试链接所有内容时,使用...
nvcc somefile.o anotherfile.o -o app.exe
我收到了来自cl 的一些警告!
cl : Command line warning D9024 : unrecognized source file type 'somefile.o', object file assumed
cl : Command line warning D9024 : unrecognized source file type 'anotherfile.o', object file assumed
当然,nvcc 假定这些目标文件是源代码并将它们发送到 cl,因为文档包括:
请注意,nvcc 不区分对象、库或资源文件。
当然cl 抱怨 - 这些目标文件应该直接传递给链接器。我知道link 最终会被调用,因为我用-Xlinker 传递了一些不相关的参数。在这些警告之后,app.exe 确实被编译了。
尽管文档表明没有链接器阶段参数,但我如何强制nvcc 仅链接 对象,而不是错误地将它们传递给cl?没有办法抑制这些警告(至少在 stackoverflow 社区没有 condemned 时是这样)。
【问题讨论】:
-
即使-link 标志指定“编译并链接”,糟糕!
标签: visual-c++ linker nvcc cl