LINK2005错误——重复定义错误
来源:百度文库 编辑:神马文学网 时间:2024/05/24 00:33:56
编程中经常能遇到LNK2005错误——重复定义错误,其实LNK2005错误并不是一个很难解决的错误。弄清楚它形成的原因,就可以
造成LNK2005错误主要有以下几种情况:
1.重复定义全局变量。可能存在两种情况:
(1)声明必须使用extern关键字;(2)不能给变量赋初值
extern int a;
下面的是定义
int a; int a = 0; extern int a =0;
B、对于那么编程不是那么严谨的程序员,总是在需要使用变量的文件中随意定义一个全局变量,并且对于变量名也不予考虑,这也往往容易造成变量名重复,而造成LNK2005错误。
2.头文件的包含重复。往往需要包含的头文件中含有变量、函数、类的定义,在其它使用的地方又不得不多次包含之,如果头文件中没有相关的宏等防止重复链接的措施,那么就会产生LNK2005错误。解决办法是在需要包含的头文件中做类似的处理:#ifndef MY_H_FILE //如果没有定义这个宏
#define MY_H_FILE //定义这个宏
……. //头文件主体内容
…….
#endif
上面是使用宏来做的,也可以使用预编译来做,在头文件中加入:
#pragma once
//头文件主体
A、选择VC菜单Project->Settings->Link->Catagory选择Input,再在Ignore libraries 的Edit栏中填入你需要忽略的库,如:Nafxcwd.lib;Libcmtd.lib。然后在Object/library Modules的Edit栏中填入正确的库的顺序,这里需要你能确定什么是正确的顺序,呵呵,God bless you!
B、选择VC菜单Project->Settings->Link页,然后在Project Options的Edit栏中输入/verbose:lib,这样就可以在编译链接程序过程中在输出窗口看到链接的顺序了。
C、选择VC菜单Project->Settings->C/C++页,Catagory选择Code Generation后再在User Runtime libraray中选择MultiThread DLL等其他库,逐一尝试。
关于编译器的相关处理过程,参考:
http://www.donews.net/xzwenlan/archive/2004/12/23/211668.aspx
这就是我所遇到过的LNK2005错误的几种情况,肯定还有其他的情况也可能造成这种错误,所以我不希望你在看完这篇文章以后,再遇到LNK2005错误时候,不动脑筋的想对号入座的排除错误。编程的过程就是一个思考的过程,所以还是多多开动你的头脑,那样收获会更多!
C&C++编译时变量重复定义的解决方法
编写目的:防止变量重复定义;头文件重复包含、嵌套包含等问题
摘要:区分变量的声明与定义,extern关键字,宏与条件编译,模块化设计
具体内容:
Part 1. 宏与条件编译
在程序的模块化设计中,我们经常把MCU/MPU的各种不同外设单独编写驱动程序程序。在C&C++工程中,为了防止头文件的重复包含,经常使用的方法如下。
/*************************************************************************
* File Name : ***.h
* Author : ***
* Version : Vx.x.x
* Date : MM/DD/YY
* Description : This file is ....
********************************************************************************/
#ifndef _MODULE_H
#define _MODULE_H
//your includes files
//your declaretion and definition
#endif // _MODULE_H
说明:1.使用宏_MODULE_H可以防止头文件的重复包含;
2.但是无法防止编译过程中的“变量重复定义”的问题。
Part 2. 解决“变量重复定义”问题的方法之一--extern关键字
在xx_module.c文件中声明该模块使用到的变量(不管是私有成员还是外部接口用的成员变量及函数),然后在此模块对应的头文件(xx_module.h)中把用于外部接口的成员变量及函数用extern关键字声明,注意这里不要对变量进行初始化,可以在xx_module.c中的原始声明处进行定义及初始化操作。然后在其他需要使用全局变量的C&C++文件中包含xx_module.h文件。编译器会为C&C++生成目标文件,然后连接时,如果该C&C++文件使用了全局变量,链接器就会链接到此C&C++文件。
/*************************************************************************
* File Name : ***.h
* Author : ***
* Version : Vx.x.x
* Date : MM/DD/YY
* Description : This file is ....
********************************************************************************/
#ifndef _MODULE_H
#define _MODULE_H
//外部接口变量声明
extern unsigned char Module_Variable1;
//外部接口函数声明
extern unsigned char ModuleFunction1(parameters list..) ;
#endif // _MODULE_H
/*************************************************************************
* File Name : ***.c
* Author : ***
* Version : Vx.x.x
* Date : MM/DD/YY
* Description : This file is ....
********************************************************************************/
#include "xx_module.h"
#include "others.h"
//外部接口变量声明及定义
unsigned char Module_Variable1 = 0;
//此模块私有变量声明及定义
unsigned int variable;
//外部接口函数声明
unsigned char ModuleFunction1(parameters list..) ;
//此模块私有函数声明
void Function2(parameters list..)
//模块中各个函数的定义
unsigned char ModuleFunction1(parameters list..)
{
}
void Function2(parameters list..)
{
}