🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: de.comp.lang.c++
3 messages
3 total messages Started by Benjamin Baermann Sun, 17 Sep 1995 14:53
Problem mit Templates und g++
#411
Author: Benjamin Baermann
Date: Sun, 17 Sep 1995 14:53
74 lines
2797 bytes
Hallo allerseits!

Bei mir ist ein Problem aufgetreten, dass ich nur beim Compilieren mit
g++ habe, aber nicht beim Compilieren mit dem Compiler von HP auf
den HP-Workstations hier in der Uni.

Das Problem tritt auf bei der Verwendung eines Listentemplates, dass mit
dem CC eigentlich ganz gut funktioniert. Der Compiler selbst gibt keine
Fehlermeldungen aus. Die kommen nur vom Linker und sehen so aus:

/bin/ld: Unsatisfied symbols:
	write__t5liste1ZiPi (code)
	_$_t5liste1Zi (code)
	reset__t5liste1Zi (code)
	__t5liste1Zi (code)
collect2: ld returned 1 exit status
		
------------------Das Testprogramm-----------------------------

#include <iostream.h>
#include "list.h"

class intli :public liste<int>
{
	public:
	        void o(){cout << *reset()<<endl;};
};

main()
{
	        int d=10;
	                intli il;
	                        il.write(&d);

	                                il.o();
}
--------------------------------------------------------------

Das ganze Listentemplate zu posten, erschien mir etwas sinnlos, deshalb
hier nur die Deklaration der Listenklasse. Falls mehr noetig wird, kann
ich es ja mailen, oder so...

-------------------Die Listenklasse-----------------------------------
template<class T>
class liste
{
  list_element<T> *anfang;
  list_element<T> *ende;
  list_element<T> *aktuell;

public:
  liste();
  ~liste();
  liste(T*);

  T*     read();        // liest aktuelles
  int    write(T*);      // schreibt naechstes, int = fehler
  T*     next();        // aktuell auf naechstes und naechstes ausgeben
  T*     reset();       // aktuell auf erstes und erstes ausgeben
  void   skip();        // eins ueberspringen
  void   loesche();     // loescht aktuelles Element aus der Liste
  int    empty();        // 1 = leer, 0 = nicht leer
};
----------------------------------------------------------

Wahrscheinlich ist die Frage ja mal wieder hochgradig banal. Ich hoffe
ihr nehmt es mir nicht uebel, aber ich gruebel jetzt schon seit einigen
Tagen ueber diesem Problem und langsam platzt mir der Kopf...

Gruese, Benni
-- 
benni@informatik.uni-frankfurt.de|http://www.uni-frankfurt.de/gnomic/hello.html
    "Deshalb, Leute, die glauben, dass Computer werden nicht koennen, wie
      Menschen zu denken, auch glaubt nicht in Maschine-Uebersetzung."
Re: Problem mit Templates und g++
#417
Author: Ullrich von Bassewitz
Date: Sun, 17 Sep 1995 20:01
46 lines
2119 bytes
Benjamin Baermann (benni@kiffer.rbi.informatik.uni-frankfurt.de) wrote:
> Das Problem tritt auf bei der Verwendung eines Listentemplates, dass mit
> dem CC eigentlich ganz gut funktioniert. Der Compiler selbst gibt keine
> Fehlermeldungen aus. Die kommen nur vom Linker und sehen so aus:
>
> /bin/ld: Unsatisfied symbols:
> 	write__t5liste1ZiPi (code)
> 	_$_t5liste1Zi (code)
> 	reset__t5liste1Zi (code)
> 	__t5liste1Zi (code)
> collect2: ld returned 1 exit status

Welche Version von g++ verwendest Du?
g++ hat in einigen Versionen etwas seltsame Ansichten darueber, wo templates
instantiiert werden. Je nach Version erzeugt g++ die Funktionen

  1. entweder statisch zu jedem Modul das die template Klasse verwendet,
     oder

  2. in jedem Modul extern, oder

  3. in einem Modul extern, in den anderen nicht.


Die Version 2.5.8 verwendet 1., bei der Version 2.6.3 wird je nach Default
beim Uebersetzen 1. oder 2. verwendet, 2.7.0. sollte es wie bei 3. machen,
nur kann es sein, dass das nicht immer tut, d.h. das u.U. die Funktionen
ueberhaupt nicht instantiiert werden.

Abhelfen kann man, indem man Kommandozeilen-Parameter verwendet (z.B.
-f-no-external-templates) oder #pragmas, die dem Compiler sagen, wo er die
templates instantiieren soll.

Sehr viel genaueres kann ich Dir dazu nicht sagen, meine Erfahrungen damit
begruenden sich auf eigenen Aerger, den ich insofern "geloest" habe, das ich
mir die g++ Version rausgesucht habe, die es (fuer mich) korrekt macht.

Alles natuerlich ohne Gewaehr, kann auch voellig falsch sein :-)

Gruss


        Uz

-- 
Ullrich von Bassewitz                              uz@ibb.schwaben.com
Re: Problem mit Templates und g++
#453
Author: Olaf Pfohl
Date: Thu, 21 Sep 1995 13:01
51 lines
2456 bytes
Ullrich von Bassewitz (uz@wuschel.ibb.schwaben.com) wrote:
: Benjamin Baermann (benni@kiffer.rbi.informatik.uni-frankfurt.de) wrote:
: > Das Problem tritt auf bei der Verwendung eines Listentemplates, dass mit
: > dem CC eigentlich ganz gut funktioniert. Der Compiler selbst gibt keine
: > Fehlermeldungen aus. Die kommen nur vom Linker und sehen so aus:
: >
: > /bin/ld: Unsatisfied symbols:
: > 	write__t5liste1ZiPi (code)
: > 	_$_t5liste1Zi (code)
: > 	reset__t5liste1Zi (code)
: > 	__t5liste1Zi (code)
: > collect2: ld returned 1 exit status

: Abhelfen kann man, indem man Kommandozeilen-Parameter verwendet (z.B.
: -f-no-external-templates) oder #pragmas, die dem Compiler sagen, wo er die
: templates instantiieren soll.

Tja, die "ubliche Template-Nerverei vom g++ ...

zun"achst steht eigentlich alles in den GCC/G++ info-Seiten, aber trotzdem
kurz die g"angigen Instanziierungs-Varianten:

- alle Template-Headerdateien werden mit `#pragma interface' ausgestattet
  und in genau einer .C-Datei ist ein `#pragma implementation <Headerfile>'
  anzugeben. Ausserdem muss diese .C-Datei mit `-fno-external-templates'
  compiliert werden.

- Benutzung von `-fno-implicit-templates'. Dann werden die `#pragma's
  ignoriert; man muss seine Template-Klassen explizit in einem .C-File
  deklarieren (man muss also genau wissen, welche Template-Klassen man 
  benutzt).

Bei grossen Projekten ist's in der Tat am einfachsten, wenn man ein
separates File f"ur die Instanziierungen benutzt. Nicht gerade sch"on...

Deine Linker-Fehlermeldungen lassen auf fehlende Instanziierung von
`liste<int>' schliessen.

Immer wieder hilfreich ist das Progr"ammchen `c++filt', welches zum
gcc/g++ Paket geh"ort und mit dem man das name mangeling r"uckg"angig
machen kann:

$ c++filt write__t5liste1ZiPi
liste<int>::write(int *)


hope that helps,
Olaf

--
(signature intentionally left blank)
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads