Templates and "-frepo" in egcs-1.1.2
Chris Rankin
CRankin@team.hutch.com.au
Mon Apr 26 16:54:00 GMT 1999
** Low Priority **
Hi,
I have an application which uses the STL, and I have been trying to reduce the amount of template-bloat. To this end, I have been trying out the "-frepo" option with egcs-1.1.2, i586-linux-pc-gnu (2.0.7-pre6), binutils-2.9.1.0.23 and Linux 2.2.6. I have not been successful.
The error I *persistently* get is:
testconf.o: In function `rb_tree<basic_string<char, string_char_traits<char>, __default_alloc_template<true, 0> >, pair<basic_string<char, string_char_traits<char>, __default_alloc_template<true, 0> > const, basic_string<char, string_char_traits<char>, __default_alloc_template<true, 0> > >, select1st<pair<basic_string<char, string_char_traits<char>, __default_alloc_template<true, 0> > const, basic_string<char, string_char_traits<char>, __default_alloc_template<true, 0> > > >, less<basic_string<char, string_char_traits<char>, __default_alloc_template<true, 0> > >, __default_alloc_template<true, 0> >::clear(void)':
testconf.o(.rb_tree<basic_string<char, string_char_traits<char>, __default_alloc_template<1, 0> >, pair<basic_string<char, string_char_traits<char>, __default_alloc_template<1, 0> > const, basic_string<char, string_char_traits<char>, __default_alloc_template<1, 0> > >, select1st<pair<basic_string<char, string_char_traits<char>, __default_alloc_template<1, 0> > const, basic_string<char, string_char_traits<char>, __default_alloc_template<1, 0> > > >, less<basic_string<char, string_char_traits<char>, __default_alloc_template<1, 0> > >, __default_alloc_template<1, 0> >::gnu.linkonce.t.clear(void)+0x21): undefined reference to `__erase__t7rb_tree5Zt12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b1i0Zt4pair2ZCt12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b1i0Zt12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b1i0Zt9select1st1Zt4pair2ZCt12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b1i0Zt12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b1i0Zt4less1Zt12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b1i0Zt24__default_alloc_template2b1i0Pt14__rb_tree_node1Zt4pair2ZCt12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b1i0Zt12basic_string3ZcZt18string_char_traits1ZcZt24__default_alloc_template2b1i0'
collect2: ld returned 1 exit status
make: *** [testconf] Error 1
(It's an "undefined reference to `__erase__t7rb_tree5Zt12basic_string...(etc)' in function rb_tree<...>::clear(void)" error; don't you love templates?)
Now as I understand it, the compiler builds the .rpo file containing all the template functions which need building, and then collect2 orders the recompilation of various modules so that there is exactly one copy of each function. It's this "recompilation" step which seems
to have been missed here, although I have successfully used -frepo in another project that used only <string>.
The source file and Makefile I used in this project are as follows:
--snip-------------------------------------------------------------
#include <string>
#include <map>
using namespace std;
class Configuration
{
public:
map<string, string> m_collect;
};
int
main()
{
Configuration config;
return 0;
}
--snip-------------------------------------------------------------
CXX=g++
CXXFLAGS=-frepo -Wall
#######################################################################
# Rules
.PHONY: all clean
all: testconf
clean:
rm -f *.o *.rpo testconf
#######################################################################
# Binaries
testconf: testconf.o
$(CXX) ${LDFLAGS} -o $@ $^
testconf.o: testconf.cpp
--snip-----------------------------------------------------------------
I think that this is probably an EGCS bug; your input is welcome,
Cheers,
Chris.
PS: I have just tested this under sparc-sun-solaris2.6/egcs-2.91.66, and it worked fine.
More information about the Gcc-bugs
mailing list