奇怪的LNK2005错误

问题描述

先交代一下背景:从网上下载的源代码,然后用CMAKE创建为VS2010项目,使用了CUDA、QT、ITK、boost等工具库错误现象:LNK2005错误,但和常见的LNK2005错误又有区别,现摘录其中一项如下:2>TurbulenceUncertVisAnimated_generated_tileGenerator.cu.obj:errorLNK2005:"private:void__thiscallNoiseTileGenerator::_generateNoiseTile(float,int)"(?_generateNoiseTile@NoiseTileGenerator@@AAEXMH@Z)已经在TurbulenceUncertVisAnimated_generated_tileGenerator.cu.obj中定义错误说明:1、TurbulenceUncertVisAnimated_generated_tileGenerator.cu.obj,其中CU文件是CUDA文件,由CUDA编译器nvcc自动编译2、值得提出的是:普通的LNK2005一般前后的OBJ文件是不一样的,如B.obj中的某函数已经在A.obj中定义,但这个却是相同的。已查找过的原因和解决方案:1、h文件没有#pragmaonce或者#ifndef排除,全部都有2、h文件中的类定义和实现未分离,或者把实现写到了定义之外,但仍然在一个h文件中。排除我的分析:1、此代码是别人正常编译过的(但不知是用的什么平台),应该不是代码本身的问题,我怀疑是否是项目在创建或转换时的一些配置出了问题。2、从LNK2005重定义的错误来看,前后的OBJ文件竟然相同,会不会有重复链接的问题?但我不会查找错误根源。。。3、从记录的编译过程看,有几个CU文件被重复编译多次,不知道是否正常?求助:希望有CMAKE和VS.net背景的大神根据以上情况给点建议或您的看法,不胜感激。如有必要,我可以贴出部分源代码和编译过程的输出内容

解决方案

解决方案二:
在这里贴出部分源代码,CUH和CU文件都是CUDA的文件,采用扩展的C++语法:tileGenerator.cuh#pragmaonce#include<cudatemplates/array.hpp>classTileGenerator{public:typedefCuda::Array3D<short>ArrayType;TileGenerator(Cuda::Size<3>tileSize):_tile(tileSize){}virtual~TileGenerator(){}ArrayType&getTile(){return_tile;}virtualfloatgetMaxDerivative()=0;virtualfloatgetStandardDeviation()=0;virtualfloatgetFrequency()=0;protected:Cuda::Array3D<short>_tile;};classNoiseTileGenerator:publicTileGenerator{public:NoiseTileGenerator(Cuda::Size<3>tileSize,floattargetFrequency,intnGaborNoisePulses=8):TileGenerator(tileSize),_frequency(targetFrequency){_generateNoiseTile(targetFrequency,nGaborNoisePulses);}virtualfloatgetMaxDerivative(){return_maxDerivative;}virtualfloatgetStandardDeviation(){return_stdDev;}virtualfloatgetFrequency(){return_frequency;}private:void_generateNoiseTile(floattargetFrequency,intnGaborNoisePulses);float_maxDerivative;float_stdDev;float_frequency;};classSinusoidTileGenerator:publicTileGenerator{public:SinusoidTileGenerator(Cuda::Size<3>tileSize,floattargetFrequency):TileGenerator(tileSize),_frequency(targetFrequency){_generateSinusoidTile(targetFrequency);}virtualfloatgetMaxDerivative(){return_maxDerivative;}virtualfloatgetStandardDeviation(){return_stdDev;}virtualfloatgetFrequency(){return_frequency;}private:void_generateSinusoidTile(floattargetFrequency);float_maxDerivative;float_stdDev;float_frequency;};

tilegenerator.cu#include<tileGenerator.cuh>#include<cudatemplates/devicememorylinear.hpp>#include<cudatemplates/copy.hpp>#include<gaborNoise.cuh>namespacedetail{classTileGenerateFunction{public:__device__virtualshortgetValue(constfloat3&pos)=0;__device__voidd_generateTile(Cuda::DeviceMemoryLinear3D<short>::KernelDataout){intx=blockIdx.x*blockDim.x+threadIdx.x;inty=blockIdx.y*blockDim.y+threadIdx.y;if(x>=out.size[0]||y>=out.size[1]){return;}for(intz=0;z<out.size[2];++z){float3pos=make_float3(x/(float)out.size[0],y/(float)out.size[1],z/(float)out.size[2]);out.data[z*out.stride[1]+y*out.stride[0]+x]=getValue(pos);}}};classNoiseTileGenerateFunction:publicTileGenerateFunction{public:__device__NoiseTileGenerateFunction(floatr,floatomegaLen,floata,intnPulses):_noise(r,omegaLen,a,nPulses){}__device__virtualshortgetValue(constfloat3&pos){return(short)((_noise.noise_evaluate(pos)/20.f)*32767);}private:GaborNoise::KernelData_noise;};classSinusoidTileGenerateFunction:publicTileGenerateFunction{public:__device__SinusoidTileGenerateFunction(floata):_a(a){}__device__virtualshortgetValue(constfloat3&pos){floatx=sinf(_a*pos.x)*sinf(_a*pos.y)*sinf(_a*pos.z);x=x<0.f?-pow(fabsf(x),0.7f):pow(fabsf(x),0.7f);return(short)((x/20.f)*32767);}private:float_a;};__global__voidd_generateNoiseTile(Cuda::DeviceMemoryLinear3D<short>::KernelDataout,floatr,floatomegaLen,floata,intnPulses){NoiseTileGenerateFunction(r,omegaLen,a,nPulses).d_generateTile(out);}__global__voidd_generateSinusoidTile(Cuda::DeviceMemoryLinear3D<short>::KernelDataout,floata){SinusoidTileGenerateFunction(a).d_generateTile(out);}}voidNoiseTileGenerator::_generateNoiseTile(floattargetFrequency,intnGaborNoisePulses){floath_gridSize=1.f/targetFrequency;floath_omegaLen=targetFrequency;//sqrt(-logf(0.05f)/pi)=0.97650970247floath_a=0.97650970247f/h_gridSize;constfloatderivFactor=nGaborNoisePulses;//Experimentalfloatx=-h_omegaLen/(2*h_a)+sqrtf(h_omegaLen*h_omegaLen/(4*h_a*h_a)+1/(2*pi*h_a));_maxDerivative=nGaborNoisePulses*2*pi*exp(-pi*h_a*x*x)*(h_omegaLen+h_a*x)/derivFactor;_stdDev=nGaborNoisePulses/(4*sqrtf(2.f)*powf(sqrtf(-logf(0.05f)/pi),3));dim3blockSize(16,16);dim3gridSize((int)ceilf((float)_tile.size[0]/blockSize.x),(int)ceilf((float)_tile.size[1]/blockSize.y));Cuda::DeviceMemoryLinear3D<short>tileMemory(_tile.size);detail::d_generateNoiseTile<<<gridSize,blockSize>>>(tileMemory,h_gridSize,h_omegaLen,h_a,nGaborNoisePulses);//d_generateNoiseTile<<<gridSize,blockSize>>>(tileMemory,h_gridSize,h_omegaLen,h_a,nGaborNoisePulses);Cuda::copy(_tile,tileMemory);}voidSinusoidTileGenerator::_generateSinusoidTile(floattargetFrequency){//TODOfloata=targetFrequency*pi;_maxDerivative=a;_stdDev=0.2;//ENDTODOdim3blockSize(16,16);dim3gridSize((int)ceilf((float)_tile.size[0]/blockSize.x),(int)ceilf((float)_tile.size[1]/blockSize.y));Cuda::DeviceMemoryLinear3D<short>tileMemory(_tile.size);detail::d_generateSinusoidTile<<<gridSize,blockSize>>>(tileMemory,a);//d_generateSinusoidTile<<<gridSize,blockSize>>>(tileMemory,a);Cuda::copy(_tile,tileMemory);}

解决方案三:
清理一下。重新编译呢?有时候重新编译就好了

时间: 2024-08-01 10:14:22

奇怪的LNK2005错误的相关文章

一个奇怪的链接错误error LNK2005

今天在链接程序的时候发现一个比较奇怪的问题: comsuppw.lib(comutil.obj) : error LNK2005: "class _variant_t vtMissing" (?vtMissing@@3V_variant_t@@A) already defined in comsupp.lib(comutil.obj) ../bin/xxx.exe : fatal error LNK1169: one or more multiply defined symbols f

奇怪的编译错误

下面代码会报一个编译错误     这段代码是我写的,在我的eclipse中没有报错,但是在别人的IDE中却报错. 解决方法: Java代码   BaseResponseDto result = null;           Object responseTextObj = response.get("responseText");           if (responseTextObj instanceof BaseResponseDto) {               res

error LNK2005 已经在***.obj中定义 的解决办法

为什么会出现这个错误??"error LNK2005: 已经在aaa.obj中定义" 编程中经常能遇到LNK2005错误--重复定义错误,其实LNK2005错误并不是一个很难解决的错误.弄清楚它形成的原因,就可以轻松解决它了.         造成LNK2005错误主要有以下几种情况:     1.重复定义全局变量.可能存在两种情况:     A.对于一些初学编程的程序员,有时候会以为需要使用全局变量的地方就可以使用定义申明一下.其实这是错误的,全局变量是针对整个工程的.正确的应该是在

攻击DNS之利用顶级域名配置错误监控Windows域用户

前言 为了寻找新的有趣的域名解析系统漏洞,我决定查看各种各样的顶级域名,并分析它们的错误配置,经过一些初步的搜索,我发现有一个很好的开源服务工具,可以帮助DNS管理员扫描它们的域名系统,察看是否存在错误配置,这就是瑞典互联网基金会开发的DNScheck工具,该工具会高亮显示出各种各样的奇怪DNS配置错误,这种错误例如:有一个权威名称服务器列表,一个域名的权威名称服务器和该名称服务器在上一级顶级名称服务器的设置之间不配置(引起这种问题的原因在"通过劫持DNS解析服务器攻击目标"这篇文章中

每位开发人员都应铭记的10句编程谚语

所谓谚语,就是用言简意赅.通俗易懂的方式传达人生箴言和普遍真理的话,它们能很好地帮助你处理生活和工作上的事情.也正因如此,我才整理了10句编程谚语,每位开发人员都应该铭记他们,武装自己. 1. 无风不起浪 别紧张,这也许只是一场消防演习 代码设计是否糟糕,从某些地方就可以看出来.比如: a. 超大类或超大函数 b. 大片被注释的代码 c. 逻辑重复 d. If/else嵌套过深 程序员们通常称它们作代码异味(Code Smell),但是就我个人认为"代码警报"这个名字更为合适一些,因为

建行支付-建行接口开发 参考代码:0130Z110C100

问题描述 建行接口开发 参考代码:0130Z110C100 最近在搞一个建行接口,在商户跳转银行出现了 参考代码:0130Z110C100,然而打电话到银行咨询过,说什么时间段问题,浏览器问题,mac校验码问题.我用的是建行给的demo,在里面修改了参数获取URL测试的,求各位大神拔刀相助!!!!!万分感激! 开发流程: 我直接是用银行的demo,然后在里面修改了商户ID代码,柜台代码,分行代码 三个参数而已. 解决方案 我也遇到了相同的问题希望解决了帮助我一下 解决方案二: 该错误为银行与商户

NESASM教程——第六天——跳转和按键处理

[读取按键] 我们假设你要读取的是一个普通的方形NES手柄,而不是一些其他乱七八糟的东西.为了知道一个按键是否按下,你一次一键地读取0x4016(手柄1)或0x4017(手柄2).如果按键按下,右边的bit0将被置位(1).你用1同它相"与",若结果不为0则跳转.在你读取任何内容之前,你需要先复位手柄(选通). [选通/复位] 为了选通/复位手柄,我们写入一个1然后一个0到0x4016(手柄1)或0x4017(手柄2).可以这么搞: lda #$01 sta $4016 lda #$0

广东程序员在加利福尼亚(转)

  作者介绍:Ryan Chen (英文名).目前在美国圣地亚哥城工作,就职于全球著名 IT 公司.Ryan Chen 在美国工作生活多年,本文是他对在美国当程序员的一些观察和感受.他的微博是 @奋斗中的胖胖.你还可以通过邮箱 ryan.chen623@yahoo.com 和他进行交流. 站长让我介绍一下在美国当程序员的工作和生活,因为国内很多同行都好奇,国外的月亮到底圆不圆.自从毕业工作后,我就很少码文字了.前段时间忙里偷闲的功夫断断续续看了一部高智商犯罪小说,叫作<谋杀官员>,对作者的想象

jpeglib使用指南

您可以到http://www.ijg.org/网站下载libjpeg的源码, IJG JPEG Library就是jpeg压缩库,是以源码的形式提供给软件开发人员的,当然在软件包里也有编译好的库文件,我们这里就只用到其中的libjpeg.lib,jconfig.h,jmorecfg.h,jpeglib.h这几个文件,下面我就介绍一下怎样在自己的程序里嵌入图像压缩功能. 一.建立编译环境 所谓建立编译环境,其实非常简单,就是把上面提到的4个文件拷贝到你的项目文件夹下,把libjpeg.lib添加到