我有一个运行良好的 CUDA 程序,但目前都写在一个文件中。我想把这个大文件分成几个小文件,以便于维护和导航。
新结构是:
foo.cuh
foo.cu
bar.cuh
bar.cu
main.cu
头.cuh
文件包含结构和函数原型,.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 的文件中未知(如预期的那样,但我不得不尝试一切) - 项目清单