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

标签 c visual-studio-2008 refactoring cuda linker-errors

我有一个运行良好的 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/

相关文章:

c - c 中的 Exec 函数在应该返回 -1 时没有返回

c - C 中的 .p 文件是什么?

你能推荐一个用C连接到互联网的库吗?

c++ - 如何检测程序陷入无限循环的位置?

c# - 如何重构这些方法以避免重复?

c# - 如何重构下面的 C# 代码?

c - 指针未返回正确的值

c++ - Visual Studio : how to create a project that would compile 2 exe files?

visual-studio-2008 - 您如何在发布版本期间自动部署网站?

c# - 简化构建字典