电脑桌面
添加小米粒文库到电脑桌面
安装后可以在桌面快捷访问

alreadydefinedin.obj“符号已定义”问题原理及解决方案

alreadydefinedin.obj“符号已定义”问题原理及解决方案_第1页
1/25
alreadydefinedin.obj“符号已定义”问题原理及解决方案_第2页
2/25
alreadydefinedin.obj“符号已定义”问题原理及解决方案_第3页
3/25
already defined in *.obj“符号已定义”问题原理及解决方案 VC6 如果想在 stdafx.h 中定义全局变量,由于该头文件会被 include 多次,所以,经常会出现以下经典的错误:already defined in StdAfx.obj。 解决方法:把该变量的定义 int g_flag 放到 stdafx.cpp 中,然后在使用的地方extern 一下。假如你在 CAADlg.cpp 中使用了该变量 g_flag,那么就在CAADlg.cpp 的首部,构造函数的定义之外,添加上 extern int g_flag; 许多 Visual C++的使用者都碰到过 LNK2005:symbol already defined 和LNK1169:one or more multiply defined symbols found 这样的链接错误,而且通常是在使用第三方库时遇到的。对于这个问题,有的朋友可能不知其然,而有的朋友可能知其然却不知其所以然,那么本文就试图为大家彻底解开关于它的种种疑惑。 大家都知道,从 C/C++源程序到可执行文件要经历两个阶段:(1)编译器将源文件编译成汇编代码,然后由汇编器(assembler)翻译成机器指令(再加上其它相关信息)后输出到一个个目标文件(object file,VC 的编译器编译出的目标文件默认的后缀名是.obj)中;(2)链接器(linker)将一个个的目标文件(或许还会有若干程序库)链接在一起生成一个完整的可执行文件。 编译器编译源文件时会把源文件的全局符号(global symbol)分成强(strong)和弱(weak)两类传给汇编器,而随后汇编器则将强弱信息编码并保存在目标文件的符号表中。那么何谓强弱呢?编译器认为函数与初始化了的全局变量都是强符号,而未初始化的全局变量则成了弱符号。比如有这么个源文件: extern int errorno; int buf[2] = {1,2}; int *p; int main() { return 0; } 其中 main、buf 是强符号,p 是弱符号,而 errorno 则非强非弱,因为它只是个外部变量的使用声明。 有了强弱符号的概念,链接器(Unix 平台)就会按如下规则(参考[1],p549~ p550)处理与选择被多次定义的全局符号: 规则 1: 不允许强符号被多次定义(即不同的目标文件中不能有同名的强符号); 规则 2: 如果一个符号在某个目标文件中是强符号,在其它文件中都是弱符号,那么选择强符号; 规则 3: 如果一个符号在所有目标文件中都是弱符号,那么选择其中任意一个; 虽然上述 3 条针对的是 Unix 平台的链接器,但据作者试验,至少 VC6.0 的linker 也遵守这些规则。由此可知多个目标文件不能重复定义同名的函数与初始化了的全...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

alreadydefinedin.obj“符号已定义”问题原理及解决方案

确认删除?
VIP
微信客服
  • 扫码咨询
会员Q群
  • 会员专属群点击这里加入QQ群
客服邮箱
回到顶部