gpt4 book ai didi

c - 尝试一起编译多个 CUDA 文件时出现链接错误 LNK2005

转载 作者:太空狗 更新时间:2023-10-29 15:28:00 26 4
gpt4 key购买 nike

我有一个运行良好的 CUDA 程序,但目前所有程序都写在一个文件中。我想将这个大文件拆分成几个较小的文件,以便于维护和导航。

新的结构是:

foo.cuh
foo.cu
bar.cuh
bar.cu
main.cu

.cuh 头文件包含结构和函数原型(prototype),.cu 文件包含函数定义(和往常一样)。主文件包含bar.cuhbar.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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com