正常に動作する CUDA プログラムがありますが、現在はすべて 1 つのファイルに書き込まれています。メンテナンスとナビゲートを容易にするために、この大きなファイルをいくつかの小さなファイルに分割したいと考えています。
新しい構造は次のとおりです。
foo.cuh
foo.cu
bar.cuh
bar.cu
main.cu
.cuh
ヘッダー ファイルには構造体と関数プロトタイプが含まれ、ファイル.cu
には (通常どおり) 関数定義が含まれます。メイン ファイルにはbar.cuh
、およびbar.cu
が含まれますfoo.cuh
。CUDA 関数を使用できるようにするために、すべての .cu ファイルには cutil_inline.h が含まれています。
したがって:
// 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 の一部です) が、このヘッダーをすべてのファイルに含める必要があります。そうしないと、コンパイルされません。私は何を間違っていますか?
更新: 状況を明確にするために: * 1 つの大きなファイル内のすべてのコードで、コンパイル、リンク、正常に実行されます * 新しい構造 (いくつかの小さなファイル) を使用し、すべての .cu ファイルに cutil_inline.h を含めると、正しくコンパイルされますが、 * 新しい構造でリンクし、メイン ファイルにのみ cutil_inline.h をインクルードすると、cutil_inline.h がインクルードされていないファイルで cutil 関数が不明であると言って、コンパイル時に失敗します (予想どおりですが、すべてを試す必要がありました)。 - リスト項目