我有一个 CUDA 程序,可以正常工作,但目前全部写在一个文件中。我想将这个大文件分成几个较小的文件,以便更容易维护和导航。
新的结构是:
foo.cuh
foo.cu
bar.cuh
bar.cu
main.cu
The .cuh
头文件包含结构体和函数原型,并且.cu
文件包含函数定义(像往常一样)。主要文件包括bar.cuh
, and bar.cu
包括foo.cuh
。所有.cu 文件都包含cutil_inline.h,以便能够使用CUDA 函数。
Hence :
// 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_inline.h 的文件中 cutil 函数未知(如预期,但我必须尝试一切)
- 项目清单