这是使用 g++ 4.4 和 g++ 4.7 在 Debian Squeeze 上测试的。考虑两个 C++ 源文件。
################
foo.cc
#################
#include <string>
using std::string;
int foo(void)
{
return 0;
}
#################
bar.cc
#################
#include <string>
using std::string;
//int foo(void);
string foo(void);
int main(void)
{
foo();
return 0;
}
##################
如果我编译并运行它,可以预见会有问题。我正在使用scons。
################################
SConstruct
################################
#!/usr/bin/python
env = Environment(
CXX="g++-4.7",
CXXFLAGS="-Wall -Werror",
#CXX="g++",
#CXXFLAGS="-Wall -Werror",
)
env.Program(target='debug', source=["foo.cc", "bar.cc"])
#################################
编译并运行...
$ scons
g++-4.7 -o bar.o -c -Wall -Werror bar.cc
g++-4.7 -o foo.o -c -Wall -Werror foo.cc
g++-4.7 -o debug foo.o bar.o
$ ./debug
*** glibc detected *** ./debug: free(): invalid pointer: 0xbff53b8c ***
======= Backtrace: =========
/lib/i686/cmov/libc.so.6(+0x6b381)[0xb7684381]
/lib/i686/cmov/libc.so.6(+0x6cbd8)[0xb7685bd8]
/lib/i686/cmov/libc.so.6(cfree+0x6d)[0xb7688cbd]
/usr/lib/libstdc++.so.6(_ZdlPv+0x1f)[0xb7856c5f]
/lib/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xb762fca6]
./debug[0x8048461]
======= Memory map: ========
08048000-08049000 r-xp 00000000 fd:10 7602195 /home/faheem/corrmodel/linker/debug
08049000-0804a000 rw-p 00000000 fd:10 7602195 /home/faheem/corrmodel/linker/debug
09ae0000-09b01000 rw-p 00000000 00:00 0 [heap]
b7617000-b7619000 rw-p 00000000 00:00 0
b7619000-b7759000 r-xp 00000000 fd:00 1180005 /lib/i686/cmov/libc-2.11.3.so
b7759000-b775a000 ---p 00140000 fd:00 1180005 /lib/i686/cmov/libc-2.11.3.so
b775a000-b775c000 r--p 00140000 fd:00 1180005 /lib/i686/cmov/libc-2.11.3.so
b775c000-b775d000 rw-p 00142000 fd:00 1180005 /lib/i686/cmov/libc-2.11.3.so
b775d000-b7760000 rw-p 00000000 00:00 0
b7760000-b777c000 r-xp 00000000 fd:00 4653173 /lib/libgcc_s.so.1
b777c000-b777d000 rw-p 0001c000 fd:00 4653173 /lib/libgcc_s.so.1
b777d000-b777e000 rw-p 00000000 00:00 0
b777e000-b77a2000 r-xp 00000000 fd:00 1179967 /lib/i686/cmov/libm-2.11.3.so
b77a2000-b77a3000 r--p 00023000 fd:00 1179967 /lib/i686/cmov/libm-2.11.3.so
b77a3000-b77a4000 rw-p 00024000 fd:00 1179967 /lib/i686/cmov/libm-2.11.3.so
b77a4000-b7889000 r-xp 00000000 fd:00 2484736 /usr/lib/libstdc++.so.6.0.17
b7889000-b788d000 r--p 000e4000 fd:00 2484736 /usr/lib/libstdc++.so.6.0.17
b788d000-b788e000 rw-p 000e8000 fd:00 2484736 /usr/lib/libstdc++.so.6.0.17
b788e000-b7895000 rw-p 00000000 00:00 0
b78ba000-b78bc000 rw-p 00000000 00:00 0
b78bc000-b78bd000 r-xp 00000000 00:00 0 [vdso]
b78bd000-b78d8000 r-xp 00000000 fd:00 639026 /lib/ld-2.11.3.so
b78d8000-b78d9000 r--p 0001b000 fd:00 639026 /lib/ld-2.11.3.so
b78d9000-b78da000 rw-p 0001c000 fd:00 639026 /lib/ld-2.11.3.so
bff41000-bff56000 rw-p 00000000 00:00 0 [stack]
Aborted
哇。如果链接器已警告foo
以两种不同的方式声明,则可以避免这种情况。即使-Wall
没有。那么,是否有它不这样做的原因,是否有一些标志可以打开以使其发出警告?提前致谢。
编辑:感谢所有的答案。当存在冲突的函数定义时,链接器确实会发出警告,而不是像我上面的示例中的冲突函数定义和声明。我不明白这种不同行为的原因。