public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* Critical behavioral change between g++-4.4/g++-4.5 and g++-4.6 ?
@ 2011-08-21  9:52 Emmanuel Fleury
  2011-08-21 10:49 ` Marc Glisse
  0 siblings, 1 reply; 3+ messages in thread
From: Emmanuel Fleury @ 2011-08-21  9:52 UTC (permalink / raw)
  To: gcc

Hi,

I was trying to compile a project called kyua with g++-4.6 and I did hit 
a linking error. It seems that a method was missing.

After some discussions with the main developer of the project, it 
appeared that depending on the version of g++ we were using the build 
was going nicely (g++-4.4/g++-4.5) or was hitting a linking error (g++-4.6).

Here is the error:

g++ -I/usr/include/lua5.1   -I/usr/include/lua5.1 
-I/usr/include/lua5.1   -I/usr/include/lua5.1   -I/usr/include/lua5.1 
-I/usr/local/include   -g -O2  -D_FORTIFY_SOURCE=2 -Wall -Wcast-qual 
-Wextra -Wpointer-arith -Wredundant-decls -Wreturn-type -Wshadow 
-Wsign-compare -Wswitch -Wwrite-strings -DNDEBUG -Wabi 
-Wctor-dtor-privacy -Wno-deprecated -Wno-non-template-friend 
-Wno-pmf-conversions -Wnon-virtual-dtor -Woverloaded-virtual -Wreorder 
-Wsign-promo -Wsynth   -o cli/cmd_about_test 
cli/cli_cmd_about_test-cmd_about_test.o libcli.a libengine.a libutils.a 
-llua5.1   libutils.a -llua5.1   libengine.a libutils.a -llua5.1 
libutils_test.a libutils.a -llua5.1   libutils.a -llua5.1 
-L/usr/local/lib -latf-c++ -latf-c
cli/cmd_about_test.cpp:106: error: undefined reference to 
'utils::cmdline::base_command<engine::user_files::config>::main(utils::cmdline::ui*, 
std::vector<std::basic_string<char, std::char_traits<char>, 
std::allocator<char> >, std::allocator<std::basic_string<char, 
std::char_traits<char>, std::allocator<char> > > > const&, 
engine::user_files::config const&)'
cli/cmd_about_test.cpp:106: error: undefined reference to 
'utils::cmdline::base_command<engine::user_files::config>::main(utils::cmdline::ui*, 
std::vector<std::basic_string<char, std::char_traits<char>, 
std::allocator<char> >, std::allocator<std::basic_string<char, 
std::char_traits<char>, std::allocator<char> > > > const&, 
engine::user_files::config const&)'
cli/cmd_about_test.cpp:87: error: undefined reference to 
'utils::cmdline::base_command<engine::user_files::config>::main(utils::cmdline::ui*, 
std::vector<std::basic_string<char, std::char_traits<char>, 
std::allocator<char> >, std::allocator<std::basic_string<char, 
std::char_traits<char>, std::allocator<char> > > > const&, 
engine::user_files::config const&)'
cli/cmd_about_test.cpp:87: error: undefined reference to 
'utils::cmdline::base_command<engine::user_files::config>::main(utils::cmdline::ui*, 
std::vector<std::basic_string<char, std::char_traits<char>, 
std::allocator<char> >, std::allocator<std::basic_string<char, 
std::char_traits<char>, std::allocator<char> > > > const&, 
engine::user_files::config const&)'
collect2: ld returned 1 exit status


And, indeed, when getting the symbols from the static libraries built 
with g++-4.4 (I had it on my system, but I can install g++-4.5 if 
needed) and g++-4.6, I got the following output (you will see that the 
method requested by the linker is missing in libcli.a):

===========
= g++-4.4 =
===========

$myshell> for lib in *.a; do echo; echo "Scanning lib ${lib}: "; echo 
"======================="; nm ${lib} | grep main; done

Scanning lib libcli.a:
=======================
libcli_a-main.o:
000003a0 t 
_ZN12_GLOBAL__N_1L9safe_mainEPN5utils7cmdline2uiEiPKPKcSt8auto_ptrINS1_12base_commandIN6engine10user_files6configEEEE
00001510 T 
_ZN3cli4mainEPN5utils7cmdline2uiEiPKPKcSt8auto_ptrINS1_12base_commandIN6engine10user_files6configEEEE
00001b00 T _ZN3cli4mainEiPKPKc
00000000 W 
_ZN5utils7cmdline12base_commandIN6engine10user_files6configEE4mainEPNS0_2uiERKSt6vectorISsSaISsEERKS4_

Scanning lib libengine.a:
=======================

Scanning lib libutils.a:
=======================
000008a0 T 
_ZN5utils7cmdline20base_command_no_data4mainEPNS0_2uiERKSt6vectorISsSaISsEE

Scanning lib libutils_test.a:
=======================

===========
= g++-4.6 =
===========

$myshell> for lib in *.a; do echo; echo "Scanning lib ${lib}: "; echo 
"======================="; nm ${lib} | grep main; done

Scanning lib libcli.a:
=======================
libcli_a-main.o:
00000000 T 
_ZN3cli4mainEPN5utils7cmdline2uiEiPKPKcSt8auto_ptrINS1_12base_commandIN6engine10user_files6configEEEE
00001180 T _ZN3cli4mainEiPKPKc

Scanning lib libengine.a:
=======================

Scanning lib libutils.a:
=======================
00000000 T 
_ZN5utils7cmdline20base_command_no_data4mainEPNS0_2uiERKSt6vectorISsSaISsEE

Scanning lib libutils_test.a:
=======================




So, now, I am looking for help to know if the problem is coming from the 
code or from g++-4.6.

Does this problem ring a bell to anyone ?


If you want to get the code that produce this problem (sorry I didn't 
manage to circumvent the problem to a small piece of code), here are the 
instructions (which are quite long I'm afraid).

1) Install atf (make, make install):
http://www.netbsd.org/~jmmv/atf/releases/0.14/

2) Get the source code of kyua:
svn co http://kyua.googlecode.com/svn/trunk/kyua-cli

3) cd kyua-cli

4) autoreconf -i -s -I /usr/local/share/aclocal

5) ./configure && make


Thanks in advance !

Regards
-- 
Emmanuel Fleury

The most important thing in the programming language is the name.
A language will not succeed without a good name. I have recently
invented a very good name and now I am looking for a suitable language.
   -- Donald Knuth

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2011-08-21 12:09 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-08-21  9:52 Critical behavioral change between g++-4.4/g++-4.5 and g++-4.6 ? Emmanuel Fleury
2011-08-21 10:49 ` Marc Glisse
2011-08-21 12:09   ` Emmanuel Fleury

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).