Этот вопрос может быть аналогичен Ошибка компоновщика 2005 и 1169 (несколько определенных символов) при использовании функций CUDA __device__ (должна быть встроена по умолчанию) , но не совсем. Я получаю несколько ошибок LNK2005 при попытке построить проект (используя код, который, как было показано, работает в другом месте) на VS2010. Я в конце своего ума.
Например, у меня есть следующие три файла: transposeGPU.h
, transposeGPU.cu
и transposeCUDA.cu
. transposeGPU.h
можно суммировать следующим образом:
void transposeGPU(float *d_dst, size_t dst_pitch,
float *d_src, size_t src_pitch,
unsigned int width, unsigned int height);
То есть одна декларация без включений. Определение этой функции содержится в transposeGPU.cu
, который можно обобщить следующим образом:
#include <stdio.h>
#include "../transposeGPU.h"
#include "../helper_funcs.h"
#include "transposeCUDA.cu"
void
transposeGPU(float *d_dst, size_t dst_pitch,
float *d_src, size_t src_pitch,
unsigned int width, unsigned int height)
{
// execution configuration parameters
dim3 threads(16, 16);
dim3 grid(iDivUp(width, 16), iDivUp(height, 16));
size_t shared_mem_size =
(threads.x * threads.y + (threads.y - 1)) * sizeof(float);
transposeCUDA<<<grid, threads, shared_mem_size>>>(
d_dst, dst_pitch / sizeof(float),
d_src, src_pitch / sizeof(float),
width, height);
}
, т.е. tranposeGPU.cu
включает в себя файл заголовка и transposeCUDA.cu
, помимо определения transposeGPU()
и вызова transposeCUDA()
, последний найден в transposeCUDA.cu
. Теперь transposeCUDA.cu
определяет функцию как ожидалось:
#include "common_kernel.h"
__global__ void
transposeCUDA(
float *g_dst, size_t s_dst_pitch,
const float *g_src, size_t s_src_pitch,
unsigned int img_width, unsigned int img_height)
{
// several lines of code...
}
Все выглядит по порядку, но я все равно получаю error LNK2005: "void __cdecl __device_stub__Z13transposeCUDAPfjPKfjjj(float *,unsigned int,float const *,unsigned int,unsigned int,unsigned int)" (?__device_stub__Z13transposeCUDAPfjPKfjjj@@YAXPAMIPBMIII@Z) already defined in transposeCUDA.obj
в transposeGPU.obj
.
Это и еще около двадцати подобных ошибок компоновщика. Зачем? Там нет очевидного переопределения происходит. Любая помощь будет принята с благодарностью.