(sinnloser?) Linker Fehler VS.NET2003

Hallo Zusammen,

ich hab ein kleines, für mich vollkommen sinnfreies, Problem unter VS.NET2003.

Ich habe ein Projekt mit mehreren source und header files.
Ganz ordentlich wie gelernt für jede Klasse ein header file für die Deklarationen und ein source file für die Definitionen.
In der main.cpp werden dann alle header files included (konkret eine Image.h und eine Histogram.h).
Nun ja, der Compiler meckert auch nicht, dafür der Linker. LNK2019 Nicht aufgelöstes externes Symbol …
Aber warum? Er compiliert die .cpp files korrekt, die .obj files werden alle erzeugt. Include ich zu den .h files auch die .cpp files (was ich aber eigentlich nicht will, es geht ja normalerweise auch anders), dann geht es.
Hat jemand ne Idee was ich machen kann? Ich habe schon versucht die .obj files irgendwie dem Linker zu übergeben, aber anscheinend funktioniert das nicht (oder ich mach was falsch). Projektpfade müssten auch stimmen, ich bin echt ratlos.

-/

Bin für jede Hilfe/Idee dankbar.

Philipp

Hallo Philipp,

ich hab ein kleines, für mich vollkommen sinnfreies, Problem
unter VS.NET2003.

Ich habe ein Projekt mit mehreren source und header files.
Ganz ordentlich wie gelernt für jede Klasse ein header file
für die Deklarationen und ein source file für die
Definitionen.
In der main.cpp werden dann alle header files included
(konkret eine Image.h und eine Histogram.h).
Nun ja, der Compiler meckert auch nicht, dafür der Linker.
LNK2019 Nicht aufgelöstes externes Symbol …
Aber warum?

Irgendwo in deinem Code wird ein Aufruf einer Funktion compiliert, allerdings wird die Funktion selbst nicht compiliert oder nur in einem anderen Modul und hat dort die Eigenschaft „static“ oder „private“, darf also nicht exportiert werden.
Deshalb hat der Linker ein Problem.

Die Datails musst du nin selber finden, zudem sollte dir der Linker verraten welche Funktion er nicht finden kann.

MfG Peter(TOO)

Irgendwo in deinem Code wird ein Aufruf einer Funktion
compiliert, allerdings wird die Funktion selbst nicht
compiliert oder nur in einem anderen Modul und hat dort die
Eigenschaft „static“ oder „private“, darf also nicht
exportiert werden.
Deshalb hat der Linker ein Problem.

Die Datails musst du nin selber finden, zudem sollte dir der
Linker verraten welche Funktion er nicht finden kann.

Welche Funktionen das sind ist ganz einfach - alle Funktionen, die nicht in der main.cpp definiert sind, findet der Linker nicht *g*.
Ich habe 2 static Funktionen innerhalb einer der Klassen, aber meine Funktionen sind alle public (explizit davor geschrieben). Die nicht-static Funktionen findet er ja auch nicht.

Könnte das Problem daran liegen, dass es template Klassen sind? Das wäre der einzige wirkliche Unterschied zu meinen bisherigen Projekten, dort habe ich Templates nur in kleinem Maße innerhalb von Klassen eingesetzt und jetzt besteht eigentlich jede Funktion aus Templates, da das Programm mit 8bit und 12bit Graustufen zurechtkommen muss.

Gruß

Philipp

Könnte das Problem daran liegen, dass es template Klassen
sind?

Wenn du die Methoden deiner template-Klasse in einem separaten cpp-Modul implementierst, dann ja:

foo.h:
template
class Foo {}
{
static void Bar();
};

foo.cpp:

template
void Foo::Bar()
{ … }

main.cpp:

#include „foo.h“

Foo::Bar(); // Linkfehler!?

Dann füge am Ende von foo.cpp mal folgende Zeile ein:

template Foo; // explizite Instanzierung

Gruß Markus

Selbes Problem!
Hi!
Ich habe genau das selbe Problem und ich verwende keine Templates!
Könnt euch ja mal unter dem Forumsbeitrag: Anfängerfragen(2 EInträge tiefer) die Frage zur getrennten Übersetzung durchlesen. Im Verlauf findet sich auch noch ein Quellcodebeispiel!
Bis jetzt hat mir noch keiner helfen können!

Gruß Rundell32

Ps. Linker gibt auch selben Fehler: unresolved external (hab einen englischen)

Der Linker verbindet die vom Compiler erzeugten Object-Dateien und erstellt eine lauffähige EXE-Datei daraus. In den obj-Dateien befinden sich die c++ Funktionen in Form von Maschinensprache. In diesem Thread schien das Problem mit templates zusammen zu hängen, die Funktionen standen zwar in der cpp-Datei, nicht aber in der obj Datei. Templates sind Code-Schablonen, wenn man dem Compiler nicht mitteilt wie er diese verwenden soll, dann gibt es auch keine zugehörige Funktion.

In deinem Thread sieht es eher danach aus, dass du zwar eine cpp Datei erstellt hast, dein Borland C++ diese Datei aber nicht übersetzt. Beim Linken fällt dann später auf, das deine Funktion aufgerufen werden soll, der Linker weiss aber nicht wo sie steht. Schau mal unter Projektverwaltung nach, dort kannst du in deiner Baumansicht sehen, welche Dateien vom Compiler bearbeitet werden. Ich vermute, dort fehlt eine Datei.

Gruß Markus

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo!
Ich verwende zwar einen Borland Compiler weiß aber leider nicht was du mit Projektverwaltung meinst! Ich benutze einen Freeware compiler!

Gruß rundell32

Hallo!
Ich verwende zwar einen Borland Compiler weiß aber leider
nicht was du mit Projektverwaltung meinst! Ich benutze einen
Freeware compiler!

Vermutlich aus der Kommandozeil? Da habe ich mit dem Borland noch nicht gearbeitet. Du wirst dir sicherlich eine Batch-Datei und/oder eine Makefile angelegt haben…

Also es gibt stets zwei Kommandos, eines zum Compilieren (.cpp->.obj) und eines zum Linken (.obj->.exe). Einige Compiler können auch zeitlich compilieren und linken, etwa wenn nur eine .cpp-Datei angegeben ist. Wenn dein Compiler compiliert und linkt, dann solltest du dir die Parameter suchen, mit denen du eine reine Compilierung bzw. Verlinkung forcieren kannst. Dann würde ich versuchen, alle .cpp-Dateien jeweils in eine .obj Datei zu compilieren. Dann gibst du dem Linker alle .obj-Dateien und den Namen der EXE-Datei an.

Falls du nicht weiter kommst, poste uns die Aufrufe aus der Kommandozeile in dieses Forum. Am besten auch gleich alle möglichen Compiler-Optionen (gibt es oft mit -h oder /h)

Gruß Markus

Hallo Markus!
Danke bei mir klappt es jetzt!

Gruß rundell32