C++ CUDA 5.5 nvlink未定义引用(继承)
我一直在致力于我的GPU光线跟踪器实现,但由于我是CUDA新手,我在编译和链接单独的.cu文件时遇到了一些问题。 我的两个类:着色器和Lambert。Lambert继承接口着色器。编译时,我收到以下错误:C++ CUDA 5.5 nvlink未定义引用(继承),c++,inheritance,cuda,raytracing,C++,Inheritance,Cuda,Raytracing,我一直在致力于我的GPU光线跟踪器实现,但由于我是CUDA新手,我在编译和链接单独的.cu文件时遇到了一些问题。 我的两个类:着色器和Lambert。Lambert继承接口着色器。编译时,我收到以下错误: Error 4 error MSB3721: The command ""G:\Development\CUDA Toolkit\CUDA Toolkit v5.5\bin\nvcc.exe" -dlink -o "Debug\CUDA RayTracer.device-link.obj" -
Error 4 error MSB3721: The command ""G:\Development\CUDA Toolkit\CUDA Toolkit v5.5\bin\nvcc.exe"
-dlink -o "Debug\CUDA RayTracer.device-link.obj" -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1
/MDd " -L"P:\My Projects\CUDA Ray-Tracer\CUDA RayTracer\ThirdParty\SDL\lib\x86" -L"P:\My
Projects\CUDA Ray-Tracer\CUDA RayTracer\CUDA RayTracer\\..\ThirdParty" -L"G:\Development\CUDA
Toolkit\CUDA Toolkit v5.5\lib\Win32" cudart.lib kernel32.lib user32.lib gdi32.lib winspool.lib
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
SDL.lib SDLmain.lib -gencode=arch=compute_30,code=sm_30 -G --machine 32 Debug\Camera.cu.obj
Debug\IShader.cu.obj Debug\Lambert.cu.obj Debug\Matrix.cu.obj Debug\Plane.cu.obj
Debug\sdl.cu.obj Debug\cuda_renderer.cu.obj" exited with code -1.
C:\Program Files(x86)\MSBuild\Microsoft.Cpp\v4.0\V110\BuildCustomizations\CUDA 5.5.targets 668
1>nvlink : error : Undefined reference to '_ZN6ShaderD1Ev' in 'Debug/IShader.cu.obj'
1>nvlink : error : Undefined reference to '_ZN6ShaderD0Ev' in 'Debug/IShader.cu.obj'
1>nvlink : error : Undefined reference to '_ZN6ShaderD2Ev' in 'Debug/Lambert.cu.obj'
我不知道“_ZN6ShaderD1Ev”是什么意思,我认为我的实现中的一切都是正确的(C++方面,不确定CUDA是怎么想的)。据我所知,CUDA 5.5支持虚拟函数和继承
我已经安装了CUDA 5.5工具包,并在我的Visual Studio 2012中启用了“生成可重定位设备代码”。此外,我还设置了“compute_30,sm_30”,以便使用“operator new”(我的图形卡可以使用GTX670MX)。我的项目只包含.cu和.cuh文件
我的源代码:
//IShader.cuh
#ifndef I_SHADER_H
#define I_SHADER_H
#include "Vector3D.cuh"
#include "Color.cuh"
#include "IGeometry.cuh"
__device__ extern Vector cameraPos;
__device__ extern Vector lightPos;
__device__ extern Color lightColor;
__device__ extern float lightPower;
__device__ extern Color ambientLight;
class Shader
{
protected:
Color _color;
public:
__device__ Shader(const Color& color);
__device__ virtual ~Shader();
__device__ virtual Color shade(Ray ray, const IntersectionData& data) = 0;
};
#endif
//IShader.cu
#include "IShader.cuh"
__device__ Shader::Shader(const Color& color)
{
this->_color = color;
}
// Lambert.cuh
#ifndef LAMBERT_H
#define LAMBERT_H
#include "IShader.cuh"
class Lambert : public Shader
{
public:
__device__ Lambert(const Color& diffuseColor);
__device__ Color shade(Ray ray, const IntersectionData& data);
};
#endif
//Lambert.cu
#include "Lambert.cuh"
Vector cameraPos;
Vector lightPos;
Color lightColor;
float lightPower;
Color ambientLight;
__device__ Lambert::Lambert(const Color& diffuseColor)
: Shader(diffuseColor)
{
}
__device__ Color Lambert::shade(Ray ray, const IntersectionData& data)
{
Color result = _color;
result = result * lightColor * lightPower / (data.p - lightPos).lengthSqr();
Vector lightDir = lightPos - data.p;
lightDir.normalize();
double cosTheta = dot(lightDir, data.normal);
result = result * cosTheta;
return result;
}
如果你需要更多的代码,我可以给你链接到github repo。
我希望你能帮助我。
提前谢谢 C++允许使用相同标识符命名的不同实体(例如函数)属于不同的名称空间。为了唯一地解析名称,编译器使用名称混乱,也就是说,它用相关实体的名称对附加信息进行编码。这就是为什么
nvlink
指的是这个“模糊”实体\u zn6shader1ev
。为了恢复更容易理解的名称,需要执行Demanling操作
虽然Demangle软件存在,但我经常使用在线demangler
使用此页面,您可以发现
_ZN6ShaderD1Ev
实际上意味着
Shader::~Shader()
这反过来表明您没有为
Shader()
类定义析构函数。请尝试联机demangler<代码>\u zn6shader1ev的意思是着色器::~Shader()
。天哪,这样一个愚蠢的错误,对我帮助很大。事实上,我没有定义析构函数。多谢各位@如果你写一个答案,我会投赞成票