编辑 - 澄清我的问题的目标:我浪费了很多时间来诊断我希望链接器报告的问题,这是由公认的糟糕的编程风格引起的,例如从一个编译单元复制粘贴代码块时会弹出到另一个,并改变它。
我正在寻找一种在编译/链接时检测此问题的方法。
在此设置中:
啊
void foo();
A.cpp
struct A {
int values[100];
A(){
std::cout << __FILE__ << ": A::A()\n";
}};
void foo(){
A a;
}
主文件
#include "A.h"
struct A {
double values[100];
A(){
std::cout << __FILE__ << ": A::A()\n";
}};
int main(){ foo(); }
// void foo(){} ===> this would cause a linker error
我希望链接器报告结构A
或至少构造函数A::A()
被定义了两次。
但是,g++ 4.4 链接就好了。运行代码显示,在这种情况下,链接器选择使用A
from A.cpp。
$ g++ -Wall A.cpp main.cpp && ./a.out
A.cpp:3
A.cpp:7
A.cpp:3
当一个函数 foo()
出现在两个目标文件中时,链接器会报告一个多重定义,但对于结构,它不会。
编辑:刚刚发现通过使用nm -C *.o
Ao 和 main.o 都A::A()
定义为弱符号。这使它可以从具有相同名称的符号池中“选择”。也许这个问题可以改写为“我怎样才能使编译器生成强符号?”......
00000000 W A::A()
我怎样才能检测到这个问题?