| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1206 人关注过本帖
标题:[求助] VS2010编译报错:重定义
只看楼主 加入收藏
nandiin
Rank: 2
等 级:论坛游民
帖 子:29
专家分:25
注 册:2013-2-28
结帖率:100%
收藏
已结贴  问题点数:50 回复次数:3 
[求助] VS2010编译报错:重定义
交代下背景:
环境:VS2010 旗舰
项目名:Output02
头文件:Processor.h
源文件:main.cpp
        CaptureImage.cpp
        ProcessImage.cpp
        MouseControl.cpp

为了查找编译报错原因,我把main.cpp写的很简单:
程序代码:
#include "Processor.h"
int main()
{
    return 0;
}


下面贴上Processor.h:
程序代码:
#ifndef _PROCESSOR
#define _PROCESSOR
#include <windows.h>
#include <WinUser.h>
#include <cv.h>
#include <highgui.h>
class CaptureImage
{
private:
    CvCapture* camCapture;
    IplImage* frameImg;
    int* pFinishIndex;
    char dir[30];
    char fileName[30];
    int fileNameCounter;
    int camW,camH;
    int gap;
    int deviceNo;
protected:
public:
    CaptureImage(int gap,int* pFinishIndex);
    CaptureImage(int gap,int deviceNo,int* pFinishIndex); //ParamList: int gap,int DeviceNo.
    bool Init();
    bool Capture();
    void Release();

    inline int GetGap() {return gap;}
    inline CvCapture** GetCamCapture() {return &camCapture;}
    inline IplImage** GetFrameImg() {return &frameImg;}
    inline int GetFileNameCounter() {return fileNameCounter;}
    inline char* GetDir() {return dir;}
    inline int GetCamW() {return camW;}
    inline int GetCamH() {return camH;}
};
class ProcessImage
{
private:
    IplImage *img1,*img2,*imgRes;
    int *pCpFinishIndex;
    char dirCapFormat[30];
    char dirResFormat[30];
    char fileName[30];
    int lastIndex;
    bool processFlag;
    bool isNew;

    bool IsTargetDot(IplImage*,IplImage*,int,int);
    bool IsValidSurround(IplImage*,IplImage*,int,int);
    bool IsTargetDot(IplImage*,int,int);
    CvRect TargetRegion(IplImage*);
    bool FileExists(char*);
    void Release();
protected:
public:
    ProcessImage(int *pCpFinishIndex);
    bool Init(int camW,int camH);
    bool Processor(int imgIndex1,int imgIndex2);
    void SetProcessFlag(bool processFlag);

    inline int GetLastIndex(){return lastIndex;}
};
class MouseController
{
private:
    static INPUT Input;
    static double screenWidth;
    static double screenHeight;
protected:
public:
    MouseController();
    static void Move(int x,int y);
    static void MoveRelated(int relatedX,int relatedY);
    static void LeftClick();
    static void LeftPress();
    static void LeftRelease();
    static void RightClick();
    static void RightPress();
    static void RightRelease();
};
INPUT MouseController::Input = *new INPUT();
double MouseController::screenWidth = ::GetSystemMetrics(SM_CXSCREEN);
double MouseController::screenHeight = ::GetSystemMetrics(SM_CYSCREEN);
unsigned __stdcall CaptureImageRun(void*);
unsigned __stdcall ProcessImageRun(void*);
#endif


之后编译报错信息为:
1>MouseControl.obj : error LNK2005: "private: static double MouseController::screenWidth" (?screenWidth@MouseController@@0NA) 已经在 main.obj 中定义
1>MouseControl.obj : error LNK2005: "private: static struct tagINPUT MouseController::Input" (?Input@MouseController@@0UtagINPUT@@A) 已经在 main.obj 中定义
1>MouseControl.obj : error LNK2005: "private: static double MouseController::screenHeight" (?screenHeight@MouseController@@0NA) 已经在 main.obj 中定义
1>E:\VS2010 WorkSpace\Output02\Debug\Output02.exe : fatal error LNK1169: 找到一个或多个多重定义的符号


哪位大侠能看一下问题出在哪里?
小弟不太懂头文件引入时编译的机制


PS:上面头文件中的声明实现部分在其他三个cpp文件中,这个会不会影响呢?

[ 本帖最后由 nandiin 于 2013-3-18 19:20 编辑 ]
搜索更多相关主题的帖子: 源文件 旗舰 项目 原因 
2013-03-18 19:15
yuccn
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:50 
INPUT MouseController::Input = *new INPUT();
 double MouseController::screenWidth = ::GetSystemMetrics(SM_CXSCREEN);
 double MouseController::screenHeight = ::GetSystemMetrics(SM_CYSCREEN);

这个 挪到 main.cpp里面去
因为你的Processor.cpp 和main.cpp都include 了Processor.h
所以出现这个问题了吧

如果Processor.cpp 和main.cpp都需要用到这几个变量,那么把提供个接口获取
或者在Processor.h  把他们什么为外部变量就可以了的

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-03-18 19:29
yuccn
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
因为你的Processor.cpp 和main.cpp都include 了Processor.h ,也就是等价于你在Processor.cpp 和main.cpp都定义了那个变量,所以重定义了

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-03-18 19:30
nandiin
Rank: 2
等 级:论坛游民
帖 子:29
专家分:25
注 册:2013-2-28
收藏
得分:0 
回复 3楼 yuccn
谢谢  问题解决了  可是生成的exe走不通啊  
图片附件: 游客没有浏览图片的权限,请 登录注册
2013-03-18 20:32
快速回复:[求助] VS2010编译报错:重定义
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.066345 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved