相关疑难解决方法(0)

了解链接器重复符号错误的来源

我有一个先前编译过的c ++程序,但是在使用Jamfiles之后,程序不再编译并ld发出了一个duplicate symbol error.在连续恢复到最初的Jamfiles,运行bjam clean,手动移除对象,并从gcc前端的clang切换到MacO 10.6.7上的gcc 4.2.1 之后,这种情况持续存在.

该程序的简化描述是有main.cpp四个文件,a.h,cpp并且b.h,cpp被编译成链接到的静态库main.o.两者,main.cpp并且b.cpp依赖于包含违规符号的文件off.h,通过两个不同的中间文件,但既不以任何方式a.h也不a.cpp依赖off.h.

你问之前,我确信,所有文件都被包裹在多个定义卫士(#ifndef,#define,#endif),虽然我没有发现失踪了他们一个文件,它并没有提及off.h.更重要的是,b.h不包括引用的任何内容off.h,只有实现,b.cpp引用任何引用off.h.仅此一点让我感到困惑.

为了增加我的困惑,我能够删除对off.hfrom 的引用,b.cpp并且正如预期的那样,它已成功重新编译.但是,当我添加引用时,它也成功编译,并在清除目标文件后继续这样做.我仍然不知道为什么它没有编译,特别是考虑到符号不应该有冲突,我已经阻止了符号重复,我已经摆脱了任何先前/不完整的构建.

由于我能够成功编译我的程序,我怀疑我是否能够重现它以测试任何建议.但是,我很好奇这是如何发生的,如果我将来遇到这种行为,除了我所做的以外什么,我可以做些什么来修复它?

c++ linker gcc clang

21
推荐指数
1
解决办法
2万
查看次数

标签 统计

c++ ×1

clang ×1

gcc ×1

linker ×1