Это было протестировано на Debian squeeze с g ++ 4.4 и g ++ 4.7.Рассмотрим два исходных файла на 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
Eww.Этого можно было бы избежать, если бы компоновщик предупреждал, что foo
объявляется двумя различными способами.Даже с -Wall
это не так.Итак, есть ли причина, почему это не так, и есть ли какой-нибудь флаг, который я могу включить, чтобы предупредить?Заранее спасибо.
РЕДАКТИРОВАТЬ: Спасибо за все ответы.Компоновщик действительно выдает предупреждение, когда есть конфликтующие определения функций, в отличие от конфликтующего определения функции и объявления, как в моем примере выше.Я не понимаю причину такого различного поведения.