关于error LNK2005错误的问题。

baoyz 2008-02-15 01:14:41
昨天,写一个关于EXCEL文件的程序。基于对话框。使用的是CSpreadSheet.h(网上到处都有)。
把头文件加入CMAINDLG中,编译通过。
再把头文件加入CUSERAPPLY1DLG(USERAPPLY1类)中,编译错误。
出现

USERAPPLY1.obj : error LNK2005: "public: __thiscall CSpreadSheet::CSpreadSheet(class CString,class CString,bool)" (??0CSpreadSheet@@QAE@VCString@@0_N@Z) already defined in PRICEDlg.obj
USERAPPLY1.obj : error LNK2005: "public: __thiscall CSpreadSheet::~CSpreadSheet(void)" (??1CSpreadSheet@@QAE@XZ) already defined in PRICEDlg.obj
USERAPPLY1.obj : error LNK2005: "public: bool __thiscall CSpreadSheet::AddHeaders(class CStringArray &,bool)" (?AddHeaders@CSpreadSheet@@QAE_NAAVCStringArray@@_N@Z) already defined in PRICEDlg.obj
USERAPPLY1.obj : error LNK2005: "public: bool __thiscall CSpreadSheet::DeleteSheet(void)" (?DeleteSheet@CSpreadSheet@@QAE_NXZ) already defined in PRICEDlg.obj
USERAPPLY1.obj : error LNK2005: "public: bool __thiscall CSpreadSheet::DeleteSheet(class CString)" (?DeleteSheet@CSpreadSheet@@QAE_NVCString@@@Z) already defined in PRICEDlg.obj
USERAPPLY1.obj : error LNK2005: "public: bool __thiscall CSpreadSheet::AddRow(class CStringArray &,long,bool)" (?AddRow@CSpreadSheet@@QAE_NAAVCStringArray@@J_N@Z) already defined in PRICEDlg.obj
USERAPPLY1.obj : error LNK2005: "public: bool __thiscall CSpreadSheet::AddCell(class CString,class CString,long,bool)" (?AddCell@CSpreadSheet@@QAE_NVCString@@0J_N@Z) already defined in PRICEDlg.obj
USERAPPLY1.obj : error LNK2005: "public: bool __thiscall CSpreadSheet::AddCell(class CString,short,long)" (?AddCell@CSpreadSheet@@QAE_NVCString@@FJ@Z) already defined in PRICEDlg.obj
USERAPPLY1.obj : error LNK2005: "public: bool __thiscall CSpreadSheet::ReplaceRows(class CStringArray &,class CStringArray &)" (?ReplaceRows@CSpreadSheet@@QAE_NAAVCStringArray@@0@Z) already defined in PRICEDlg.obj
USERAPPLY1.obj : error LNK2005: "public: bool __thiscall CSpreadSheet::ReadRow(class CStringArray &,long)" (?ReadRow@CSpreadSheet@@QAE_NAAVCStringArray@@J@Z) already defined in PRICEDlg.obj
USERAPPLY1.obj : error LNK2005: "public: bool __thiscall CSpreadSheet::ReadColumn(class CStringArray &,class CString,bool)" (?ReadColumn@CSpreadSheet@@QAE_NAAVCStringArray@@VCString@@_N@Z) already defined in PRICEDlg.obj
USERAPPLY1.obj : error LNK2005: "public: bool __thiscall CSpreadSheet::ReadColumn(class CStringArray &,short)" (?ReadColumn@CSpreadSheet@@QAE_NAAVCStringArray@@F@Z) already defined in PRICEDlg.obj
USERAPPLY1.obj : error LNK2005: "public: bool __thiscall CSpreadSheet::ReadCell(class CString &,class CString,long,bool)" (?ReadCell@CSpreadSheet@@QAE_NAAVCString@@V2@J_N@Z) already defined in PRICEDlg.obj
USERAPPLY1.obj : error LNK2005: "public: bool __thiscall CSpreadSheet::ReadCell(class CString &,short,long)" (?ReadCell@CSpreadSheet@@QAE_NAAVCString@@FJ@Z) already defined in PRICEDlg.obj
USERAPPLY1.obj : error LNK2005: "public: void __thiscall CSpreadSheet::BeginTransaction(void)" (?BeginTransaction@CSpreadSheet@@QAEXXZ) already defined in PRICEDlg.obj
USERAPPLY1.obj : error LNK2005: "public: bool __thiscall CSpreadSheet::Commit(void)" (?Commit@CSpreadSheet@@QAE_NXZ) already defined in PRICEDlg.obj
USERAPPLY1.obj : error LNK2005: "public: bool __thiscall CSpreadSheet::RollBack(void)" (?RollBack@CSpreadSheet@@QAE_NXZ) already defined in PRICEDlg.obj
USERAPPLY1.obj : error LNK2005: "public: bool __thiscall CSpreadSheet::Convert(class CString)" (?Convert@CSpreadSheet@@QAE_NVCString@@@Z) already defined in PRICEDlg.obj
USERAPPLY1.obj : error LNK2005: "private: bool __thiscall CSpreadSheet::Open(void)" (?Open@CSpreadSheet@@AAE_NXZ) already defined in PRICEDlg.obj
USERAPPLY1.obj : error LNK2005: "private: short __thiscall CSpreadSheet::CalculateColumnNumber(class CString,bool)" (?CalculateColumnNumber@CSpreadSheet@@AAEFVCString@@_N@Z) already defined in PRICEDlg.obj
USERAPPLY1.obj : error LNK2005: "private: void __thiscall CSpreadSheet::GetExcelDriver(void)" (?GetExcelDriver@CSpreadSheet@@AAEXXZ) already defined in PRICEDlg.obj
Debug/PRICE.exe : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.

找过多个方法:
1、头文件中做类似的处理:#ifndef MY_H_FILE //如果没有定义这个宏
#define MY_H_FILE //定义这个宏
……. //头文件主体内容
…….
#endif
无效,文件本身就有,再加一个还是无效。
2、使用预编译来做,在头文件中加入:
#pragma once
无效。
3、在IDE下Project->Settings->Link页,选categroy为custom,将force file output前打勾,有一堆的警告。不知是否影响效果。
4、将.CPP包含头文件的顺序改变。
原来是

#include "stdafx.h"
#include "MAIN.h"
#include "USERAPPLY1.h"
#include "CSpreadSheet.h"

改为

#include "CSpreadSheet.h"
#include "stdafx.h"
#include "MAIN.h"
#include "USERAPPLY1.h"

可以编译但是不能适用"CSpreadSheet.h"中定义的函数。
#include "CSpreadSheet.h"不在第1行编译就失败。
请用过"CSpreadSheet.h"的高人指点。


...全文
350 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
masktime 2011-03-06
  • 打赏
  • 举报
回复
我最近也遇到这个问题,云之巅,问题解决了,哈哈
baoyz 2008-02-20
  • 打赏
  • 举报
回复
加分了。
iyranly 2008-02-19
  • 打赏
  • 举报
回复
谢谢
baoyz 2008-02-19
  • 打赏
  • 举报
回复
To:buyong
class CSpreadSheet;以后,构造函数CSpreadSheet ss("t2.xls","t2",true);不能使用了。
error C2079: 'ss' uses undefined class 'CSpreadSheet'
改成声明后是否需要加其他语句?

To:云之巅
方法可用。谢谢。加分。
iyranly 2008-02-15
  • 打赏
  • 举报
回复
只要工程中有两个以上的地方包含这个头文件就会出现这个错误。解决的办法很简单,建立一个CSpreadSheet.cpp文件,然后在这个文件的开头加上:


#include “stdafx.h”
#include “CSpreadSheet.h”
然后把CSpreadSheet.h中的从”// Open spreadsheet for reading and writing”(含)到”#endif”(不含)之前的语句都剪切到CSpreadSheet.cpp中,也就是将类的声明和实现分离,再将CSpreadSheet.cpp文件加到工程中,这样就可以了。

buyong 2008-02-15
  • 打赏
  • 举报
回复
重复定义了
在CUSERAPPLY1DLG中不加头文件,改为声明
class CSpreadSheet;
iyranly 2008-02-15
  • 打赏
  • 举报
回复
One of the following may be a cause:

1、The most common cause of this error is accidentally linking with both the single-threaded and multithreaded libraries. Ensure that the application project file includes only the appropriate libraries and that any third-party libraries have appropriately created single-threaded or multithreaded versions.


2、The given symbol was a packaged function (created by compiling with /Gy) and was included in more than one file but was changed between compilations. Recompile all files that include the symbol.


3、The given symbol was defined differently in two member objects in different libraries, and both member objects were used.


4、An absolute was defined twice, with a different value in each definition.

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧