1

「リンクエラーLNK2005...すでに定義されています」というエラーで問題が発生しました。ファイルは次のとおりです。

// File Bitmap4.cu
#include "Bitmap4.h" // header
#include "Bitmaps_cuda.h" // header with just the definitions of the kernels

..... // I call 3+2 kernel functions (3 in one method, 1 in another and 1 in another one)

それから私はこれを持っています:

// File Bitmap8.cu
#include "Bitmap8.h" // header
#include "Bitmaps_cuda.h" // the same as above

..... // I call 4 kernel functions (4 in the same method)

次に、カーネルヘッダーがあります。

#ifndef __BITMAPS_KERNEL__
#define __BITMAPS_KERNEL__

......  // 9 kernels definitions

#endif

そして最後に、私はこれを持っています:

// File Bitmaps_cuda.h
#include <cuda.h>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
#include <device_functions.h>
#include <stdio.h>

// Inside here there all the kernel functions that the files 
// Bitmap4.cu and Bitmap8.cu are using

問題は、もちろん、Bitmap *.cuの1つに#include"Bitmaps_cuda.h"を含めないと、コンパイラーはカーネル関数の定義を見逃したと言うことです。私はたくさんの投稿を読みました、そして私はすでに「追加の依存関係」と必要なPATHを含めました。Bitmap8.cuファイルとその相対カーネルを追加したときに問題が発生しました。それ以前は、アプリケーションが正しく機能していたためです。

とにかく、それらは私が持っているエラーです:

1>Bitmap8.cu.obj : error LNK2005: "void * __cdecl big_random_block(int(?big_random_block@@YAPAXH@Z) already defined in Bitmap4.cu.obj
1>Bitmap8.cu.obj : error LNK2005: "int * __cdecl big_random_block_int(int(?big_random_block_int@@YAPAHH@Z) already defined in Bitmap4.cu.obj
1>Bitmap8.cu.obj : error LNK2005: "unsigned char __cdecl value(float,float,int(?value@@YAEMMH@Z) already defined in Bitmap4.cu.obj
1>Bitmap8.cu.obj : error LNK2005: "void * __cdecl start_thread(unsigned int(__stdcall*)(void *),void *)" (?start_thread@@YAPAXP6GIPAX@Z0@Z) already defined in Bitmap4.cu.obj
1>Bitmap8.cu.obj : error LNK2005: "void __cdecl end_thread(void *)"(?end_thread@@YAXPAX@Z) already defined in Bitmap4.cu.obj
1>Bitmap8.cu.obj : error LNK2005: "void __cdecl destroy_thread(void *)"(?destroy_thread@@YAXPAX@Z) already defined in Bitmap4.cu.obj
1>Bitmap8.cu.obj : error LNK2005: "void __cdecl wait_for_threads(void * const *,int)"(?wait_for_threads@@YAXPBQAXH@Z) already defined in Bitmap4.cu.obj
1>Bitmap8.cu.obj : error LNK2005: "void __cdecl__device_stub__Z14float_to_colorPhPKf(unsigned char *,float const *)"(?__device_stub__Z14float_to_colorPhPKf@@YAXPAEPBM@Z) already defined in Bitmap4.cu.obj
1>Bitmap8.cu.obj : error LNK2005: "void __cdecl float_to_color(unsigned char *,float_const *)" (?float_to_color@@YAXPAEPBM@Z) already defined in Bitmap4.cu.obj
1>Bitmap8.cu.obj : error LNK2005: "void __cdecl__device_stub__Z14float_to_colorP6uchar4PKf(struct uchar4 *,float const *)"(?__device_stub__Z14float_to_colorP6uchar4PKf@@YAXPAUuchar4@@PBM@Z) already defined in Bitmap4.cu.obj
1>Bitmap8.cu.obj : error LNK2005: "void __cdecl float_to_color(struct uchar4 *,float_const *)" (?float_to_color@@YAXPAUuchar4@@PBM@Z) already defined in Bitmap4.cu.obj

1>C:\Users\dberdin\documents\visual studio 2010\Projects\gpuSPAM\Debug\gpuSPAM.exe : fatal error LNK1169: one or more multiply defined symbols found

私はさまざまな解決策を試しましたが、結果はありました。

前もって感謝します!

編集

Webサイト(http://msdn.microsoft.com/en-us/library/72zdcz6f.aspx)で、これらのエラーの原因の1つが次のとおりであることがわかりました
。-絶対値が2回定義され、定義ごとに異なる値が設定されている。
ええと、実際、私が一番下に書いたように、私はこれらの種類の定義を持っていますが、私は別の方法で行うことはできません。それを解決する方法はありますか?

よろしくお願いします

4

2 に答える 2

2

これらのエラーは、ファイルを二重にインクルードしたために発生しました。問題が解決しました!

于 2012-04-09T06:49:47.563 に答える
1
Then I have the kernel header:

#ifndef __BITMAPS_KERNEL__
#define __BITMAPS_KERNEL__

......  // 9 kernels definitions

#endif

定義ではなく、9つのカーネル宣言があるということですか?

カーネル定義をヘッダーファイルに含めることはできません。

すべての.cuファイルが同じランタイムにリンクしていることを確認します(各.cuファイルのプロパティシートを開いてCUDA C/C++ | Host | Runtime Library設定を比較します)。また、通常のcppファイルで使用されているランタイムと同じであることを確認します。

于 2012-04-04T15:57:06.563 に答える