1

我在使用 Visual Studio 2010 时遇到了这些非常奇怪的问题。在这一点上,这种行为非常不稳定,我真的希望我不必将它用于 CUDA(我知道我不必但很难不使用它)。

我在使用非常基本的东西时遇到的许多问题之一是头文件被多次包含。例如:

//vars.cuh
#if !defined(VARS_cuh)
#define VARS_cuh

#include <cuda.h>
#include <cuda_runtime_api.h>

int* kern_xstart, *kern_xend, *kern_ystart, *kern_yend, *kern_zstart, *kern_zend;
/* more variable definitions */

#endif

然后我将这个文件包含在我的大部分源文件中:

//source_file.cu
extern "C"{
#include "vars.cuh"
/* more includes of my own headers */
#include <cuda.h>
#include <cuda_runtime_api.h>
}

/* source file body */

VS 2010 编译器会输出如下错误:“error LNK2005: foo already defined in other_source_file_I_wrote.cu.obj”

为什么要这样做?另外,为了用一块石头杀死两只鸟,使用这种设置,我在 source_file.cu 中编写一个函数,然后在 vars.cuh 中对其进行原型设计时也遇到了问题。问题出现了 vars.cuh 看不到定义,即使我清楚地将 vars.cuh 包含在 source_file.cu 中!

谢谢!

4

1 回答 1

9

头文件被多次编译,因为正如您所说,您在大多数源文件中都包含此头文件。这些全局变量包含在多个源文件中,因此在包含标头的每个源文件中定义。当链接器将所有目标文件链接在一起时,它会找到这些变量的多个定义,因此会出现错误。

如果要跨多个源文件共享全局变量,请将它们声明为extern在标头中,然后在一个源文件中定义它们中的每一个。

这不是 Visual Studio 或 Visual C++ 编译器的问题,而是 C 的工作方式。

于 2012-06-11T21:15:49.887 回答