fatal error LNK1169: one or more multiply defined symbols found
"public: __thiscall CSpreadSheet::CSpreadSheet(class CString,class CString,bool)" (??0CSpreadSheet@@QAE@VCString@@0_N@Z) already defined in EditExecl.obj
应该是说在两个obj文件中重复定义了类?如果不加,又说没有定义这个类,不能通过编译,请问如何解决,谢谢。
18 个解决方案
#1
没人复我的?
自己顶一下先
自己顶一下先
#2
应该这是违背一次定义的原则的,你先include一次试试看?
#3
但是只在其中一个对话框中include的话,在另外一个对话框中就不能使用这个自定义的类阿
#4
在.h中加上宏 #ifndef ... #define ... #endif;
#5
extern
#6
那你在 文件1.h 中包含这个头文件,然后在 文件2 中包 含文件1.h
#7
anothervip(cadet) 的是标准做法,格式为:
#ifndef _YOUR_INCLUDE_
#define _YOUR_INCLUDE_
(头文件主体)
#endif
其中_YOUR_INCLUDE_可以是你喜欢的其他符号
#ifndef _YOUR_INCLUDE_
#define _YOUR_INCLUDE_
(头文件主体)
#endif
其中_YOUR_INCLUDE_可以是你喜欢的其他符号
#8
用extern的话,一样是不行阿。我是这样用的,在对话框的cpp文件中,extern class SS
不可以阿。各位能解释清楚#ifndef 的写法吗?
不可以阿。各位能解释清楚#ifndef 的写法吗?
#9
#if !defined(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_)
#define AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_
(头文件)
#endif
简单的条件编译:第一次编译该头文件时没有define(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_),此时!defined(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_)为真, 则编译头文件代码。
再一次包含该头问件时,给文件已经编译,!defined(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_)为False ,就不在编译头文件代码。
#define AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_
(头文件)
#endif
简单的条件编译:第一次编译该头文件时没有define(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_),此时!defined(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_)为真, 则编译头文件代码。
再一次包含该头问件时,给文件已经编译,!defined(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_)为False ,就不在编译头文件代码。
#10
CSpreadSheet是个控件吧(不会是楼主自己写的吧)
在生成EditExecl.obj
的相关文件里 重复定义了CSpreadSheet::CSpreadSheet(class CString,class CString,bool)。
并不是.h重复定义的问题。
是生成了两个相同函数的实体,在连接的时候Link程序无法选择的问题。
#11
可以删除中间文件重新编译。
#12
是不是把类的实现代码放在了.h文件中了?
#13
这和头文件包含没有关系,看看你的实现代码
#14
如果是VC7,直接在头文件前面加一句#pragma once就可以了
#15
编译器这样提示应该不是你把头文件包含两次的问题,如果你的代码没问题的话,这样使用是可以的
#16
CSpareadSheet确实是一个控件,类代码的实现也是在头文件中,应该是zhuzhufox(狐狸的小猪)所说的问题了,但是删除了中间文件好像还是不行阿
#17
大家再帮帮忙喔~
#18
ServiceMain.obj : error LNK2005: "struct _COMPLETION_IO_OPERATION_HEAD Completion_Operation_Head" (?Completion_Operation_Head@@3U_COMPLETION_IO_OPERATION_HEAD@@A) already defined in KernelProcess.obj
#1
没人复我的?
自己顶一下先
自己顶一下先
#2
应该这是违背一次定义的原则的,你先include一次试试看?
#3
但是只在其中一个对话框中include的话,在另外一个对话框中就不能使用这个自定义的类阿
#4
在.h中加上宏 #ifndef ... #define ... #endif;
#5
extern
#6
那你在 文件1.h 中包含这个头文件,然后在 文件2 中包 含文件1.h
#7
anothervip(cadet) 的是标准做法,格式为:
#ifndef _YOUR_INCLUDE_
#define _YOUR_INCLUDE_
(头文件主体)
#endif
其中_YOUR_INCLUDE_可以是你喜欢的其他符号
#ifndef _YOUR_INCLUDE_
#define _YOUR_INCLUDE_
(头文件主体)
#endif
其中_YOUR_INCLUDE_可以是你喜欢的其他符号
#8
用extern的话,一样是不行阿。我是这样用的,在对话框的cpp文件中,extern class SS
不可以阿。各位能解释清楚#ifndef 的写法吗?
不可以阿。各位能解释清楚#ifndef 的写法吗?
#9
#if !defined(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_)
#define AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_
(头文件)
#endif
简单的条件编译:第一次编译该头文件时没有define(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_),此时!defined(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_)为真, 则编译头文件代码。
再一次包含该头问件时,给文件已经编译,!defined(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_)为False ,就不在编译头文件代码。
#define AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_
(头文件)
#endif
简单的条件编译:第一次编译该头文件时没有define(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_),此时!defined(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_)为真, 则编译头文件代码。
再一次包含该头问件时,给文件已经编译,!defined(AFX_BACKUPDATA_H__12CB1686_D72C_45A0_8419_1D4B2D408E23__INCLUDED_)为False ,就不在编译头文件代码。
#10
CSpreadSheet是个控件吧(不会是楼主自己写的吧)
在生成EditExecl.obj
的相关文件里 重复定义了CSpreadSheet::CSpreadSheet(class CString,class CString,bool)。
并不是.h重复定义的问题。
是生成了两个相同函数的实体,在连接的时候Link程序无法选择的问题。
#11
可以删除中间文件重新编译。
#12
是不是把类的实现代码放在了.h文件中了?
#13
这和头文件包含没有关系,看看你的实现代码
#14
如果是VC7,直接在头文件前面加一句#pragma once就可以了
#15
编译器这样提示应该不是你把头文件包含两次的问题,如果你的代码没问题的话,这样使用是可以的
#16
CSpareadSheet确实是一个控件,类代码的实现也是在头文件中,应该是zhuzhufox(狐狸的小猪)所说的问题了,但是删除了中间文件好像还是不行阿
#17
大家再帮帮忙喔~
#18
ServiceMain.obj : error LNK2005: "struct _COMPLETION_IO_OPERATION_HEAD Completion_Operation_Head" (?Completion_Operation_Head@@3U_COMPLETION_IO_OPERATION_HEAD@@A) already defined in KernelProcess.obj