【发布时间】:2010-12-30 21:36:42
【问题描述】:
我有一个运行良好的 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 的文件中未知(如预期的那样,但我不得不尝试一切) - 列表项
【问题讨论】:
-
您能否澄清一下,它是否与所有 .cu 文件中包含的 cutil_inline.h 进行编译和链接?你说你得到了描述结构的错误,但是你必须在所有文件中包含 cutil_inline.h 才能让它“编译”,所以不确定哪些有效,哪些无效。
-
我更新了我的答案。我的意思是所有 .cu 文件中都包含 cutil_inline.h,它可以编译但无法链接,即错误来自链接器而不是编译器。
标签: c visual-studio-2008 refactoring cuda linker-errors