我正在尝试使用设备链接通过Visual Studio 2019编译cuda代码。 (-dc
编译器选项)。对于项目功能,我既需要nvcc
生成的代码,也需要我项目中其他文件的g++
生成的代码。因此nvcc
编译cuda文件,g++
编译c ++文件。
我想创建一个可从CPU和GPU都访问的Vector3类,因此我使用__device__ __host__
函数声明器在文件Vector3.h
中声明了我的方法。
但是我在链接器上遇到了一些麻烦。我收到错误消息:Vector3.cu.obj : error LNK2001: unresolved external symbol __cudaRegisterLinkedBinary_42_tmpxft_00001b9c_00000000_7_Vector3_cpp1_ii_b7c8c887
。
我用于类声明的文件Vector3.h看起来像这样:
#include <cuda.h>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
namespace engine {
class Vector3;
}
class engine::Vector3
{
public:
__device__ __host__ Vector3();
__device__ __host__ Vector3(double const& x, double const& y, double const& z);
__device__ __host__ double get_x() const;
__device__ __host__ double get_y() const;
__device__ __host__ double get_z() const;
__device__ __host__ double get_magnitude() const;
ptree get_client_data() const;
__device__ __host__ void set(double const& x, double const& y, double const& z);
__device__ __host__ void set_x(double const& x);
__device__ __host__ void set_y(double const& y);
__device__ __host__ void set_z(double const& z);
__device__ __host__ Vector3 get_normalized() const;
__device__ __host__ void rotate_x(double const& angle);
__device__ __host__ void rotate_y(double const& angle);
__device__ __host__ void rotate_z(double const& angle);
__device__ __host__ Vector3 operator+(Vector3 const& v) const;
__device__ __host__ Vector3 operator*(double const& v) const;
__device__ __host__ void operator+=(Vector3 const& v);
__device__ __host__ void operator*=(double const& v);
__device__ __host__ double dot(Vector3 const& v) const;
protected:
double x_, y_, z_;
};
Cuda编译器命令行:
"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nvcc.exe" --use-local-env -ccbin "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.22.27905\bin\HostX86\x64" -x cu -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include" --keep-dir x64\Release -maxrregcount=0 --machine 64 --compile -cudart shared -Xcompiler "/EHsc /nologo /Zi /MD " -o x64\Release\%(Filename)%(Extension).obj "%(FullPath)" -dc -Xcompiler "/FS"
Cuda链接器命令行:
"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nvcc.exe" -dlink -o x64\Release\Polynom.device-link.obj -Xcompiler "/EHsc /nologo /Zi " -L"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\lib\x64" cudart.lib