1>main.cu.obj : error LNK2005: _main 已经在 kernel.cu.obj 中定义
错误原因:
kernel.cu 文件中也有一个main入口函数, 在进行编译时,生成的kernel.cu.obj 目标文件中 生成了 _main函数
_main 函数 :__main()是编译系统提供的一个函数,负责完成库函数的初始化和初始化应用程序执行环境,最后自动跳转到main()。所以说,前者是库函数,后者就是我们自己编写的main()主函数;
而 main.cu 函数 中也有一个main 函数, 因此在对 main.cu进行编译生成 main.cu.obj 后,
在链接过程中,发现 同样的 _main 函数,因此 发生了重复定义的错误。 也就是 编译时候 不检查重复符号,链接阶段发生报错。
解决方案:
删掉 kernel.cu文件 或者 改掉该文件中的 main函数名
错误2:
>D:/work/test/wb/wb/main.cu(262): warning C4244: “初始化”: 从“double”转换到“float”,可能丢失数据
1>helpers.cu.obj : error LNK2019: 无法解析的外部符号 _cudaDeviceSynchronize@0,该符号在函数 "void __cdecl renderFusedMap(struct Image<unsigned short,struct Ref>,struct Image<struct float3,struct Ref> const &)" (?renderFusedMap@@YAXU?$Image@GURef@@@@ABU?$Image@Ufloat3@@URef@@@@@Z) 中被引用
1>kernel.cu.obj : error LNK2001: 无法解析的外部符号 _cudaDeviceSynchronize@0
1>helpers.cu.obj : error LNK2019: 无法解析的外部符号 _cudaConfigureCall@32,该符号在函数 "void __cdecl setBoxWrap(struct Volume,struct float3,struct float3,float)" (?setBoxWrap@@YAXUVolume@@Ufloat3@@1M@Z) 中被引用
1>kernel.cu.obj : error LNK2001: 无法解析的外部符号 _cudaConfigureCall@32
1>kfusion.cu.obj : error LNK2001: 无法解析的外部符号 _cudaConfigureCall@32
1>helpers.cu.obj : error LNK2019: 无法解析的外部符号 _cudaSetupArgument@12,该符号在函数 "void __cdecl __device_stub__Z9setSphere6Volume6float3ff(struct Volume &,struct float3 const &,float,float)" (?__device_stub__Z9setSphere6Volume6float3ff@@YAXAAUVolume@@ABUfloat3@@MM@Z) 中被引用
1>kernel.cu.obj : error LNK2001: 无法解析的外部符号 _cudaSetupArgument@12
1>kfusion.cu.obj : error LNK2001: 无法解析的外部符号 _cudaSetupArgument@12
1>helpers.cu.obj : error LNK2019: 无法解析的外部符号 _cudaLaunch@4,该符号在函数 "enum cudaError __cdecl cudaLaunch<char>(char *)" (??$cudaLaunch@D@@YA?AW4cudaError@@PAD@Z) 中被引用
1>kernel.cu.obj : error LNK2001: 无法解析的外部符号 _cudaLaunch@4
1>kfusion.cu.obj : error LNK2001: 无法解析的外部符号 _cudaLaunch@4
1>helpers.cu.obj : error LNK2019: 无法解析的外部符号 ___cudaRegisterFatBinary@4,该符号在函数 "void __cdecl __nv_cudaEntityRegisterCallback(void * *)" (?__nv_cudaEntityRegisterCallback@@YAXPAPAX@Z) 中被引用
1>kernel.cu.obj : error LNK2001: 无法解析的外部符号 ___cudaRegisterFatBinary@4
1>kfusion.cu.obj : error LNK2001: 无法解析的外部符号 ___cudaRegisterFatBinary@4
1>main.cu.obj : error LNK2001: 无法解析的外部符号 ___cudaRegisterFatBinary@4
1>helpers.cu.obj : error LNK2019: 无法解析的外部符号 ___cudaUnregisterFatBinary@4,该符号在函数 "void __cdecl __cudaUnregisterBinaryUtil(void)" (?__cudaUnregisterBinaryUtil@@YAXXZ) 中被引用
1>kernel.cu.obj : error LNK2001: 无法解析的外部符号 ___cudaUnregisterFatBinary@4
1>kfusion.cu.obj : error LNK2001: 无法解析的外部符号 ___cudaUnregisterFatBinary@4
1>main.cu.obj : error LNK2001: 无法解析的外部符号 ___cudaUnregisterFatBinary@4
1>helpers.cu.obj : error LNK2019: 无法解析的外部符号 ___cudaRegisterFunction@40,该符号在函数 "void __cdecl __nv_cudaEntityRegisterCallback(void * *)" (?__nv_cudaEntityRegisterCallback@@YAXPAPAX@Z) 中被引用
1>kernel.cu.obj : error LNK2001: 无法解析的外部符号 ___cudaRegisterFunction@40
1>kfusion.cu.obj : error LNK2001: 无法解析的外部符号 ___cudaRegisterFunction@40
1>kernel.cu.obj : error LNK2019: 无法解析的外部符号 _cudaGetLastError@0,该符号在函数 "enum cudaError __cdecl addWithCuda(int *,int const *,int const *,unsigned int)" (?addWithCuda@@YA?AW4cudaError@@PAHPBH1I@Z) 中被引用
1>kfusion.cu.obj : error LNK2001: 无法解析的外部符号 _cudaGetLastError@0
1>kernel.cu.obj : error LNK2019: 无法解析的外部符号 _cudaGetErrorString@4,该符号在函数 "enum cudaError __cdecl addWithCuda(int *,int const *,int const *,unsigned int)" (?addWithCuda@@YA?AW4cudaError@@PAHPBH1I@Z) 中被引用
1>kfusion.cu.obj : error LNK2001: 无法解析的外部符号 _cudaGetErrorString@4
1>kernel.cu.obj : error LNK2019: 无法解析的外部符号 _cudaFree@4,该符号在函数 "enum cudaError __cdecl addWithCuda(int *,int const *,int const *,unsigned int)" (?addWithCuda@@YA?AW4cudaError@@PAHPBH1I@Z) 中被引用
1>main.cu.obj : error LNK2001: 无法解析的外部符号 _cudaFree@4
1>kernel.cu.obj : error LNK2019: 无法解析的外部符号 _cudaMalloc@8,该符号在函数 "enum cudaError __cdecl addWithCuda(int *,int const *,int const *,unsigned int)" (?addWithCuda@@YA?AW4cudaError@@PAHPBH1I@Z) 中被引用
1>kfusion.cu.obj : error LNK2001: 无法解析的外部符号 _cudaMalloc@8
1>kernel.cu.obj : error LNK2019: 无法解析的外部符号 _cudaDeviceReset@0,该符号在函数 "int __cdecl kkkmain(void)" (?kkkmain@@YAHXZ) 中被引用
1>kernel.cu.obj : error LNK2019: 无法解析的外部符号 _cudaSetDevice@4,该符号在函数 "enum cudaError __cdecl addWithCuda(int *,int const *,int const *,unsigned int)" (?addWithCuda@@YA?AW4cudaError@@PAHPBH1I@Z) 中被引用
1>kernel.cu.obj : error LNK2019: 无法解析的外部符号 _cudaMemcpy@16,该符号在函数 "enum cudaError __cdecl addWithCuda(int *,int const *,int const *,unsigned int)" (?addWithCuda@@YA?AW4cudaError@@PAHPBH1I@Z) 中被引用
1>kfusion.cu.obj : error LNK2019: 无法解析的外部符号 _cudaSetDeviceFlags@4,该符号在函数 "public: void __thiscall KFusion::Init(struct KFusionConfig const &)" (?Init@KFusion@@QAEXABUKFusionConfig@@@Z) 中被引用
1>kfusion.cu.obj : error LNK2019: 无法解析的外部符号 _cudaHostAlloc@12,该符号在函数 "public: void __thiscall Host::alloc(unsigned int)" (?alloc@Host@@QAEXI@Z) 中被引用
1>main.cu.obj : error LNK2019: 无法解析的外部符号 _cudaFreeHost@4,该符号在函数 "public: __thiscall Host::~Host(void)" (??1Host@@QAE@XZ) 中被引用
1>D:\work\test\wb\Debug\wb.exe : fatal error LNK1120: 17 个无法解析的外部命令
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
原因 : 强制关机后,重启打开vs2013后,重新打开项目,自动配成了 win32项目平台, 与库目录中cuda的64位的路径和库 不一致,导致找不到。
解决方案:调整平台,调整目标计算机类型。
报错:
模块计算机类型“X86”与目标计算机类型“x64”冲突
调整平台,方法错误,不能直接在平台下拉菜单选择,不起作用,确定后,重新查看,依然是win32平台。
需要打开配置管理器选择,改成X64.
参考资料:
编译cuda程序出错
-
Q1>LINK : warning LNK4075: 忽略“/INCREMENTAL”(由于“/LTCG”规范)
1>test.cu.obj : error LNK2005: _main 已经在 kernel.cu.obj 中定义
1>test.cu.obj : error LNK2001: 无法解析的外部符号 __imp__cutCheckCmdLineFlag@12
1>test.cu.obj : error LNK2001: 无法解析的外部符号 __imp__cutGetCmdLineArgumenti@16
1>F:\c++\vs2010\example\Release\example.exe : fatal error LNK1120: 2 个无法解析的外部命令 -
A全天下的 LINK 错误 都是一样的,就是编译器 找不到那个函符号。
你要顺藤摸瓜,看看你link 不到的那个外部符号在哪里,你的编译器用引用了没有..