Wiki

Clone wiki

The Dark Aid / Fehler LNK2019 - Nicht aufgelöstes externes Symbol

Unter Windows kann es dazu kommen, dass beim Kompilieren (eigentlich beim Linken) der Fehler LNK2019 aufritt.

LNK2019_nichtaufgeloestessymbol.png

In dem Fall wurde in einer neuen Klasse ein Makro vergessen. Das kann passieren weil der Fehler nur unter Windows auftritt, der Entwickler die Klasse aber nicht unter Windows entwickelt hat. Der Fehler tritt dann bei ihm nicht auf.

Grundsätzlich sollte der Fehler vom Entwickler behoben werden, der ihn verantwortet hat. Wenn man in den Fehler reinläuft kann man sich aber relativ einfach selbst behelfen, um TDA wieder kompiliere/linken zu können.

In jedem Projekt gibt es eine Header-Datei wie tde5rulessharedlibrary.h oder tde5guiwidgetssharedlibrary.h. Der Name hat immer das Schema "tde5<Projekt>sharedlibrary.h". Die Datei befindet sich im Hauptverzeichnis des Projekts/oberste Ebene.

sharedlibraryheader.png

Der Inhalt der Datei hat immer das Folgende Schema.

#ifndef TDE5RULESSHAREDLIBRARY_H
#define TDE5RULESSHAREDLIBRARY_H

#include <QtCore/QtGlobal>

#if defined(TDE5RULESSHAREDLIB_LIBRARY)
#define TDE5RULESSHAREDLIB_EXPORT Q_DECL_EXPORT
#else
#define TDE5RULESSHAREDLIB_EXPORT Q_DECL_IMPORT
#endif

#endif // TDE5RULESSHAREDLIBRARY_H

Wichtig ist hier das Makro welches in dem #if hinter #define steht. In beiden Zweigen des Ifs steht immer das gleiche Makro. In obigem Beispiel TDE5RULESSHAREDLIB_EXPORT. Bei Klassen in einem Projekt die von einem anderen Projekt verwendet werden, muss für dem Microsoft Compiler dieses Makro vor dem Klassennamen vorhanden sein, sonst kommt es zu dem Fehler. In dem Screenshot der Fehlermeldung steht das RulesInitFocusRule das nicht aufgelöste externe Symbol ist, bzw. die Funktionen dieser Klasse. Im Falle des Fehlers sieht die Definition der Klasse so aus:

class RulesInitFocusRule

Es müsste aber so aussehen.

class TDE5RULESSHAREDLIB_EXPORT RulesInitFocusRule

Wenn der Fehler beim Linke auftritt, sollte das behoben werden, wenn man das Makro ergänzt.

Wichtig ist, dass man das Makro aus dem Projekt verwendet, in dem sich die Klasse befindet. Das Makro ist für jedes Projekt etwas anders, das es den Projektnamen enthält.

Die Klasse RulesInitFocusRule befindets ich im Projekt rules und dort steht TDE5RULESSHAREDLIB_EXPORT in tde5rulessharedlibrary.h.

Updated