Πόσο καλά τα πάει ο gcc με τα templates;

Giorgos Keramidas keramida at ceid.upatras.gr
Tue May 2 22:36:08 EEST 2006


On 2006-05-02 22:11, "Theodoros V. Kalamatianos" <thkala at softlab.ece.ntua.gr> wrote:
>On Tue, 2 May 2006, Giorgos Keramidas wrote:
>>On 2006-05-02 19:46, Karaoulis Marios <marios_hellas_23 at yahoo.gr> wrote:
>>>> Έτρεξα τον gcc ως εξής:
>>>> gcc -c wastage1d.cpp
>>>
>>> Διακόψτε με αν λέω βλακείες αλλά με ο gcc είναι ο c compiler.
>>> Εσύ θές c++, άρα
>>> g++  -c wastage1d.cpp
>>
>>Οχι, δε λες βλακείες.
>
> Εγώ πάλι γιατί έχω την εντύπωση ότι το gcc είναι frontend και
> ότι χρησιμοποιεί την κατάληξη του αρχείου για να διαλέξει ποιο
> backend θα τρέξει; IIRC μπορείς να του ταΐσεις ακόμα και
> Fortran και θα είναι εντάξει, αρκεί να τελείωνει το αρχείο σε
> .f. Ή το άλλαξαν αυτό στους gcc-4.x; Ο gcc-3.4 μου, πάντως
> καλεί το C++ backend αν το αρχείο τελείωνει σε .cpp.

Δε νομίζω.  Σε τουλάχιστον 2 διαφορετικά συστήματα, το gcc(1)
αποτυγχάνει επειδή δε χρησιμοποιεί τις C++ βιβλιοθήκες, παρόλο
που το όνομα του source file τελειώνει σε `.cc' εδώ.

*********************************************************************
% uname -v
FreeBSD 7.0-CURRENT #0: Thu Apr 20 06:26:59 EEST 2006
% gcc -v
Using built-in specs.
Configured with: FreeBSD/i386 system compiler
Thread model: posix
gcc version 3.4.4 [FreeBSD] 20050518
% cat -n foo.cc
     1  #include <iostream>
     2  #include <iomanip>
     3
     4  int
     5  main(void)
     6  {
     7
     8          std::cout << "Hello world" << std::endl;
     9          return 0;
    10  }
% gcc
/tmp/ccnPiyGt.o(.text+0xd): In function `std::__verify_grouping(char const*, unsigned int, std::string const&)':
: undefined reference to `std::string::size() const'
/tmp/ccnPiyGt.o(.text+0x60): In function `std::__verify_grouping(char const*, unsigned int, std::string const&)':
: undefined reference to `std::string::operator[](unsigned int) const'
/tmp/ccnPiyGt.o(.text+0x9d): In function `std::__verify_grouping(char const*, unsigned int, std::string const&)':
: undefined reference to `std::string::operator[](unsigned int) const'
/tmp/ccnPiyGt.o(.text+0xc8): In function `std::__verify_grouping(char const*, unsigned int, std::string const&)':
: undefined reference to `std::string::operator[](unsigned int) const'
/tmp/ccnPiyGt.o(.text+0x11c): In function `main':
: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
/tmp/ccnPiyGt.o(.text+0x129): In function `main':
: undefined reference to `std::cout'
/tmp/ccnPiyGt.o(.text+0x12e): In function `main':
: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/tmp/ccnPiyGt.o(.text+0x137): In function `main':
: undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
/tmp/ccnPiyGt.o(.text+0x166): In function `__static_initialization_and_destruction_0(int, int)':
: undefined reference to `std::ios_base::Init::Init()'
/tmp/ccnPiyGt.o(.text+0x197): In function `__tcf_0':
: undefined reference to `std::ios_base::Init::~Init()'
/tmp/ccnPiyGt.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'

**********************************************************************
% uname -a
SunOS XXXXXX 5.10 Generic_118844-28 i86pc i386 i86pc
% gcc -v
Reading specs from /opt/sfw/lib/gcc/i386-pc-solaris2.10/3.4.2/specs
Configured with: ../gcc-3.4.2/configure --prefix=/opt/sfw --with-ld=/usr/ccs/bin/ld --with-gnu-as --with-as=/opt/sfw/bin/gas --enable-shared --disable-libgcj
Thread model: posix
gcc version 3.4.2
% gcc foo.c
Undefined                       first referenced
 symbol                             in file
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned int) const/var/tmp//ccgwUpMT.o
std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))/var/tmp//ccgwUpMT.o
std::cout                           /var/tmp//ccgwUpMT.o
std::ios_base::Init::~Init()        /var/tmp//ccgwUpMT.o
std::ios_base::Init::Init()         /var/tmp//ccgwUpMT.o
__gxx_personality_v0                /var/tmp//ccgwUpMT.o
std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)/var/tmp//ccgwUpMT.o
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const/var/tmp//ccgwUpMT.o
std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)/var/tmp//ccgwUpMT.o
ld: fatal: Symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status

Αντίθετα το g++ παίζει μια χαρά και στα δύο λειτουργικά.  Η πιο
σημαντική διαφορά είναι ότι το g++ αντί για τις βιβλιοθήκες:

    -lgcc -lgcc_eh -lc -lgcc -lgcc_eh

στο link στάδιο χρησιμοποιεί τις:

    -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc

Οπότε υπάρχει όντως διαφορά.




More information about the Linux-greek-users mailing list