为什么Visual Studio 2010包含头文件两次?

时间:2012-06-11 21:12:28

标签: c visual-c++ include header-files visual-c++-2010

我一直在使用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编译器发出如下错误:“错误LNK2005:foo已在other_source_file_I_wrote.cu.obj中定义”

为什么这样做?另外,为了用一块石头杀死两只鸟,使用这种设置,我也有在source_file.cu中编写函数,然后在vars.cuh中进行原型设计的问题。问题是vars.cuh无法看到定义,即使我在source_file.cu中明确包含vars.cuh!

谢谢!

1 个答案:

答案 0 :(得分:9)

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

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

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