1

私は、Visual Studio 2010 でこれらの非常に奇妙な問題を抱えていました。この時点で、動作が非常に不安定なので、CUDA に使用する必要がなかったことを本当に望んでいます (使用する必要がないことはわかっていますが、使用しないの難しいです)。それを使用する)。

本当に基本的なことで私が抱えている多くの問題の 1 つは、ヘッダー ファイルが複数回インクルードされることです。例えば:

//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 でプロトタイピングすることにも問題があります。source_file.cu に vars.cuh を明確に含めているにもかかわらず、vars.cuh が定義を認識できないという問題が発生します。

ありがとうございました!

4

1 に答える 1

9

あなたが言うように、このヘッダーファイルはほとんどのソースファイルに含まれているため、ヘッダーファイルは複数回コンパイルされています。これらのグローバル変数は複数のソース ファイルに含まれているため、ヘッダーを含むすべてのソース ファイルで定義されています。リンカーがすべてのオブジェクト ファイルをリンクすると、それらの変数の複数の定義が検出されるため、エラーが発生します。

複数のソース ファイルでグローバル変数を共有する場合は、それらをexternヘッダーで宣言してから、1 つのソース ファイルでそれぞれを 1 回定義します。

これは、Visual Studio や Visual C++ コンパイラの問題ではなく、C のしくみです。

于 2012-06-11T21:15:49.887 に答える