У меня проблемы с созданием моей программы.Я работаю на 32-битной Windows 7 Professional с Visual Studio 2008. У меня есть Cuda SDK, и мой проект настроен со всеми ссылками на cudart.lib и т. Д. Моя проблема в том, что когда я пытаюсь построить свой проект, он возвращает следующие ошибки:
1> crowdSim.obj: ошибка LNK2019: неразрешенный внешний символ _setParameters, указанный в функции «protected: void __thiscall Crowd :: _ create (int)" (? _Create @ Crowd @@ IAEXH @ Z)1> crowdSim.obj: ошибка LNK2019: неразрешенный внешний символ _mapBuffer, на который ссылается функция "protected: void __thiscall Crowd :: _ create (int)" (? _Create @ Crowd @@ IAEXH @ Z) 1> crowdSim.obj: ошибка LNK2019: не разрешенавнешний символ _allocToDevice, на который ссылается функция «protected: void __thiscall Crowd :: _ create (int)» (? _create @ Crowd @@ IAEXH @ Z) 1> crowdSim.obj: ошибка LNK2019: неразрешенный внешний символ _registerBuffer, на который есть ссылка в функции "protected: void__thiscall Crowd :: _ create (int) "(? _create @ Crowd @@ IAEXH @ Z) 1> ../../ bin / win32 / Debug / crowd.exe: фатальная ошибка LNK1120: 4 не удалось разрешитьd externals
Кажется, моя проблема в том, как я настраиваю свои методы "allocToDevice", "mapBuffer", "setParameters" и "registerBuffer", поскольку, если я закомментирую их, я смогу построитьпроект не проблема.
Я определил методы в следующих файлах:
crowdSim.cuh:
extern "C"
{
void checkCUDAError(const char *msg);
void setParameters(SimParams *hostParams);
void registerBuffer(uint vbo);
void allocToDevice(void **ptr, int memSize);
void mapBuffer(void **ptr, uint vbo);
}
crowdSim.cu:
#include <cstdlib.h>
#include <cstdio.h>
#include <string.h>
#include <cuda_gl_interop.h>
// includes, kernels
#include "crowd_kernel.cu"
extern "C"
{
void checkCUDAError(const char *msg)
{
cudaError_t err = cudaGetLastError();
if( cudaSuccess != err)
{
fprintf(stderr, "Cuda error: %s: %s.\n", msg, cudaGetErrorString( err) );
exit(-1);
}
}
void setParameters(SimParams *hostParams)
{
// copy parameters to constant memory
cudaMemcpyToSymbol(params, hostParams, sizeof(SimParams));
}
void registerBuffer(uint vbo)
{
cudaGLRegisterBufferObject(vbo);
}
void allocToDevice(void **ptr, size_t memSize)
{
cudaMalloc(ptr, memSize);
}
void mapBuffer(void **ptr, uint vbo)
{
cudaGLMapBufferObject(ptr, vbo);
}
} //extern "C"
и они вызываются только из метода _create в моем классе "Crowd" из crowdSim.cpp:
#include <math.h>
#include <memory.h>
#include <cstdio>
#include <cstdlib>
#include <GL/glew.h>
#include "crowdSim.h"
#include "crowdSim.cuh"
#include "crowd_kernel.cuh"
Crowd::Crowd(uint crowdSize) :
//numP(crowdSize),
hPos(0),
hVel(0),
dPosIn(0),
dVelIn(0),
dPosOut(0),
dVelOut(0)
{
params.numBodies = crowdSize;
_create(crowdSize);
}
Crowd::~Crowd()
{
//_remove();
crowdSize = 0;
}
uint
Crowd::newVBO(uint size)
{
GLuint vbo;
// glGenBuffers(1, &vbo);
// glBindBuffer(GL_ARRAY_BUFFER, vbo);
// glBufferData(GL_ARRAY_BUFFER, size, 0, GL_DYNAMIC_DRAW);
// glBindBuffer(GL_ARRAY_BUFFER, 0);
return vbo;
}
void
Crowd::_create(int numPeople)
{
crowdSize = numPeople;
unsigned int memSize = sizeof(float) * crowdSize * 4;
hPos = new float[crowdSize*4];
hVel = new float[crowdSize*4];
hPos = (float*) malloc(memSize);
hVel = (float*) malloc(memSize);
posVbo = newVBO(memSize);
registerBuffer(posVbo);
allocToDevice((void**) &dPosIn, memSize);
allocToDevice((void**) &dPosOut, memSize);
allocToDevice((void**) &dVelIn, memSize);
allocToDevice((void**) &dVelOut, memSize);
mapBuffer((void**)&dPosVbo, posVbo);
setParameters(¶ms);
}
Мне кажется, что я здесь упускаю что-то очень простое, но не могу понять, что таклюбая помощь будет отличной!