我有一个运行良好的 CUDA 程序,但目前所有程序都写在一个文件中。我想将这个大文件拆分成几个较小的文件,以便于维护和导航。
新的结构是:
foo.cuh
foo.cu
bar.cuh
bar.cu
main.cu
.cuh
头文件包含结构和函数原型(prototype),.cu
文件包含函数定义(和往常一样)。主文件包含bar.cuh
,bar.cu
包含foo.cuh
。所有 .cu 文件都包含 cutil_inline.h,以便能够使用 CUDA 函数。
因此:
// main.cu
#include "bar.cuh"
#include <cutil_inline.h>
int main() [...]
// bar.cu
#include "bar.cuh"
#include "foo.cuh"
#include <cutil_inline.h>
[...]
// foo.cu
#include "foo.cuh"
#include <cutil_inline.h>
[...]
问题是当我用这个新结构编译我的 Visual Studio 2008 项目时,我得到大量的链接错误:
error LNK2005: "void __cdecl __cutilBankChecker(unsigned int,unsigned int,unsigned int,unsigned int,unsigned int,unsigned int,char *,int,char *,int)" (?__cutilBankChecker@@YAXIIIIIIPADH0H@Z) already defined in cuda_generated_foo.cu.obj cuda_generated_bar.cu.obj
error LNK2005: "void __cdecl __cutilCondition(int,char *,int)" (?__cutilCondition@@YAXHPADH@Z) already defined in cuda_generated_foo.cu.obj cuda_generated_bar.cu.obj
error LNK2005: "void __cdecl __cutilExit(int,char * *)" (?__cutilExit@@YAXHPAPAD@Z) already defined in cuda_generated_foo.cu.obj cuda_generated_bar.cu.obj
error LNK2005: "int __cdecl cutGetMaxGflopsDeviceId(void)" (?cutGetMaxGflopsDeviceId@@YAHXZ) already defined in cuda_generated_foo.cu.obj cuda_generated_bar.cu.obj
error LNK2005: "void __cdecl __cudaSafeCallNoSync(enum cudaError,char const *,int)" (?__cudaSafeCallNoSync@@YAXW4cudaError@@PBDH@Z) already defined in cuda_generated_foo.cu.obj cuda_generated_bar.cu.obj
error LNK2005: "void __cdecl __cudaSafeCall(enum cudaError,char const *,int)" (?__cudaSafeCall@@YAXW4cudaError@@PBDH@Z) already defined in cuda_generated_foo.cu.obj cuda_generated_bar.cu.obj
error LNK2005: "void __cdecl __cudaSafeThreadSync(char const *,int)" (?__cudaSafeThreadSync@@YAXPBDH@Z) already defined in cuda_generated_foo.cu.obj cuda_generated_bar.cu.obj
error LNK2005: "void __cdecl __cufftSafeCall(enum cufftResult_t,char const *,int)" (?__cufftSafeCall@@YAXW4cufftResult_t@@PBDH@Z) already defined in cuda_generated_foo.cu.obj cuda_generated_bar.cu.obj
我明白它们的意思(所有那些已经定义的符号都是 cutil_inline.h 的一部分)但是我必须在所有文件中包含这个头文件,否则它不会编译。我做错了什么?
更新:澄清情况: * 所有代码都在一个大文件中,编译、链接和运行都很好 * 使用新结构(几个较小的文件)并在所有 .cu 文件中包含 cutil_inline.h,它编译正确但在链接期间失败 * 使用新结构并仅在主文件中包含 cutil_inline.h,它在编译期间失败,表示 cutil 函数在未包含 cutil_inline.h 的文件中未知(正如预期的那样,但我必须尝试一切) - 列表项
最佳答案
我的程序也出现了这个错误。我通过在 __global__
或 __device__
之前添加关键字 inline
来解决它。然后,错误消失了。
关于c - 尝试一起编译多个 CUDA 文件时出现链接错误 LNK2005,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1976587/