gpt4 book ai didi

c++ - 在 VS2008 : LNK2019 中构建 Cuda 程序时遇到问题

转载 作者:搜寻专家 更新时间:2023-10-31 01:59:18 27 4
gpt4 key购买 nike

我在构建我的程序时遇到了一些问题。我正在使用 Visual Studio 2008 在 Windows 7 专业 32 位上工作。我有 Cuda SDK,我的项目设置了所有指向 cudart.lib 等的链接。我的问题是当我尝试构建我的项目时它返回以下错误:

1>crowdSim.obj : error LNK2019: unresolved external symbol _setParameters referenced in function "protected: void __thiscall Crowd::_create(int)" (?_create@Crowd@@IAEXH@Z) 1>crowdSim.obj : error LNK2019: unresolved external symbol _mapBuffer referenced in function "protected: void __thiscall Crowd::_create(int)" (?_create@Crowd@@IAEXH@Z) 1>crowdSim.obj : error LNK2019: unresolved external symbol _allocToDevice referenced in function "protected: void __thiscall Crowd::_create(int)" (?_create@Crowd@@IAEXH@Z) 1>crowdSim.obj : error LNK2019: unresolved external symbol _registerBuffer referenced in function "protected: void __thiscall Crowd::_create(int)" (?_create@Crowd@@IAEXH@Z) 1>../../bin/win32/Debug/crowd.exe : fatal error LNK1120: 4 unresolved 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"

它们仅在我的 crowdSim.cpp 的“Crowd”类中的 _create 方法中调用:

#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(&params);

}

我觉得我在这里遗漏了一些非常基本的东西,但我无法弄清楚是什么,所以任何帮助都会很棒!

最佳答案

您是否添加了 cuda.rules 文件以使 Visual Studio 能够识别 .cu 扩展名? cuda.rules 教 VS 如何处理 .cu 以便编译和链接它。参见 this post有关设置的更多信息。

顺便说一句,如果头文件中的函数声明(原型(prototype))中有 extern "C",那么定义(实现)中就不需要它。它可以使您的代码更整洁 - 通常我根本不使用 extern "C"

关于c++ - 在 VS2008 : LNK2019 中构建 Cuda 程序时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3151074/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com