already defined in *
obj“符号已定义”问题原理及解决方案 VC6 如果想在 stdafx
h 中定义全局变量,由于该头文件会被 include 多次,所以,经常会出现以下经典的错误:already defined in StdAfx
解决方法:把该变量的定义 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)两类传给汇编器,而随后汇编器则将强弱信息编码并保存在目标文件的符号表中
那么何谓强弱呢
编译器认为函数与初始化了的全局变量都是强符号,而未初始化的全局变量则成了弱符号
比如有这么个源文