错误:“LNK1169找到一个或者多个重定义的符号”
来源:互联网 发布:网络卫生直报平台 编辑:程序博客网 时间:2024/05/19 10:10
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">今天自己写了一个头文件,然后依照书上推荐的“声明和实现分离”方法,把类的成员函数写在头文件和head1.h里,然后把实现写在c1.cpp文件里。</span>
class CXX{public:static int k;};
在类中,我声明了一个静态变量。开始怎么也无法使用,发生错误:LNK2001 无法解析的外部符号……
后来查资料才知道,是使用静态变量方法不对,使用静态变量必须在外部定义它才行。
class CXX{
...};
int CXX::k;
然后,编译的时候就出错了。
“LNK1169找到一个或者多个重定义的符号”
重定义?我仔细检查了,并没有发现重名的情况。我注意到编译信息里说的,好像正是我之前定义的那个静态变量!
我理解的是,因为重复引用头文件,导致定义了两次变量。
于是我试着在头文件前加上预编译指令:
#ifndef HEAD1#define HEAD1...#endif
这样来似乎能防止重复定义?但是!!依然出错!!
为什么宏定义没有起作用?
为什么编译第二次的时候无视了预处理指令?
。。。
等等,无视?
我突然明白了,预处理指令只对当前文件起作用!在链接前,每个obj文件的生成都是互不相干的!
那这么一来,问题解决了。只需要把放在头文件里的变量定义移动到cpp文件即可。
原因是在引用头文件时,编译器是将头文件的全部放到cpp前,在两个cpp文件生成obj后,自然会有两次定义,但是放到cpp文件中,就没有问题了。
一般来说,头文件里最好只放声明,不放定义,除非某些特殊原因一定要放在头文件里(在另外一篇文里就会提到这种情况)。这好像又绕回了文章开头,声明就像一个多孔接口,大家都能用,但是接口的实现是只有一个的,如果有很多实现,就不知道该调用那个实现了。
0 0
- 错误:“LNK1169找到一个或者多个重定义的符号”
- error LNK1169 : 找到一个或多个重定义的符号
- 错误3error LNK1169: 找到一个或多个多重定义的符号
- xxx.dll: fatal error LNK1169:找到一个或多个重定义的符号
- 使用vs编译出现 ”error LNK1169: 找到一个或多个多重定义的符号“的错误
- “error LNK1169: 找到一个或多个多重定义的符号”的解决方法(转载)
- error LNK1169: 找到一个或多个多重定义的符号”的解决方法(转载)
- error LNK1169: 找到一个或多个多重定义的符号”的解决方法
- “error LNK1169: 找到一个或多个多重定义的符号”的解决方法
- C++杂记:“error LNK1169: 找到一个或多个多重定义的符号”的解决方法
- “error LNK1169: 找到一个或多个多重定义的符号”的解决方法(转载)
- “error LNK1169: 找到一个或多个多重定义的符号”的解决方法
- “error LNK1169: 找到一个或多个多重定义的符号”的解决方法(转载)
- “error LNK1169: 找到一个或多个多重定义的符号”的解决方法
- “error LNK1169: 找到一个或多个多重定义的符号”的解决方法
- "error LNK1169: 找到一个或多个多重定义的符号"另外的解决办法
- “error LNK1169: 找到一个或多个多重定义的符号”的解决方法(转载)
- “error LNK1169: 找到一个或多个多重定义的符号”的解决方法(转载)
- Linux 进程间通信 ----消息队列
- 约瑟夫环问题
- collectionheaderview
- 环境变量中path不小心删除了
- Linux IO模式
- 错误:“LNK1169找到一个或者多个重定义的符号”
- 文章标题
- 第十五讲--Oracle存储结构:文件
- Widora MT7688 开发板录音放音使用方法
- [Poj 1426] Find The Multiple BFS
- Java基础静态变量、静态方法
- Windows下CMD命令大全
- 安卓ART与dalvik
- Maven时遇到的一个错误