c++ - CUDA 5.5 nvlink undefined reference (继承)

标签 c++ inheritance cuda raytracing

我一直在研究我的 GPU-raytracer 实现,但由于我是 CUDA 的新手,我在编译和链接单独的 .cu 文件时遇到了一些问题。 我的 2 个类(class):Shader 和 Lambert。 Lambert继承了接口(interface)Shader。当我编译时,我收到以下错误:

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 存储库的链接。 我希望你可以帮助我。 提前致谢!

最佳答案

C++ 允许使用相同标识符命名的不同实体(例如,函数)属于不同的命名空间。为了唯一地解析名称,编译器使用名称修改,也就是说,它将附加信息编码到相关实体的名称中。这就是为什么 nvlink 指的是这个“晦涩”的实体 _ZN6ShaderD1Ev。为了恢复一个更易于理解的名称,demangling 操作是必要的。

虽然有拆线软件,但我经常使用在线拆线器

c++filtjs

使用这个页面,你可以发现

_ZN6ShaderD1Ev

实际上是指

Shader::~Shader()

反过来,这表明您没有为 Shader() 类定义析构函数。

关于c++ - CUDA 5.5 nvlink undefined reference (继承),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20351984/

相关文章:

c++ - 为什么 VS2013 不零初始化这个结构?

cuda - 全局写入中的内存合并

java - 强制转换 List<> 覆盖 Java 中的内部类

java - java中的方法重载和继承

c++ - CUDA Nsight - 将有关内核执行的信息保存到 excel 文件

synchronization - CUDA/OpenCL 中的现实死锁示例

c++ - 如果运算符删除没有实现,为什么不能编译

c++ - OpenGL 纹理绑定(bind)到对象

c++ - 一个接受输入小写字母的短程序,它给出大写字母并在按下回车键时退出

c++ - 迭代一个类的所有对象(但不是该类的父类 - C++)