调试 "multiple definition of ..." 错误的一般技巧?

General techniques for debugging the "multiple definition of ..." error?

我正在寻找一般调试"tricks"来寻找这种错误信息的根源问题:

build/nat.cpp.o:(.bss+0x0): multiple definition of `input::helloCounter'
build/sam.cpp.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status

这里,input::helloCounter是在头文件中定义的全局变量,但是头文件用ifndef...保护得很好。

这里粘贴源代码应该是没有意义的,因为太多了。但是我想知道您是否有一些通用的技术可以在这种情况下进行调试,例如通过插入一些特殊代码来暴露问题?有关信息,我使用 Ubuntu 14.04,Clang/g++ 作为编译器。

这主要是一个特定于实现的问题。您没有指定您使用的是哪种编译器或操作系统,因此无法提供针对您的平台的特定帮助。但是,例如,在 Linux 上的类似情况下,我会使用 nm(1) tool from binutils 在所有目标代码文件中搜索定义符号的目标代码文件,找到定义它的所有目标代码文件,以及确定哪些不应该定义它。

一旦知道哪个目标代码文件的定义不应该存在,就可以检查相应的源文件以确定它是如何编译的。

我敢肯定,无论您使用的是什么编译器或操作系统,它都必须具有可以以相同方式使用的类似工具。