Template Linker-Fehler in Release-Build
-
Hi zusammen,
ich hab anscheinend irgendwas mit den Template-Klassen noch nicht richtig verstanden.
Beim Linken im Release-Build bricht er ab und ich kriege ich folgenden Fehler:[ilink32 Fehler] Error: Nicht auflösbares externes 'config::SettingParamRange<int>::CorrectRange()' referenziert von D:\...\WIN32\RELEASE\FormXX.OBJ
Seltsamerweise läuft es im Debug-Build problemlos durch und auch zur Laufzeit funktioniert alles.
Ich habe folgendes Setup:
config.h
namespace config { template <typename T> struct SettingParamRange : public SettingParam<T> { [...] //Methoden bool CorrectRange(); }; }
config.cpp
template<typename T> bool config::SettingParamRange<T>::CorrectRange() { [...] }
FormXX.h
#include <config.h>
FormXX.cpp
void TFormXX::loadIntegers (std::map<String, config::SettingParamRange<int>> &map) const { for (auto& setting : map) { if ( setting.second.CorrectRange() ) { [...] } }
Kann mir jmd erklären, wo der Fehler liegt?
-
Methoden eines Klassen templates dürfen nicht in einer cpp definiert werden.
Entweder im header selbst oder was auch oft genutzt wird in einer separaten datei (oft *.inl genannt), welche aber im header includiert wird.
-
@firefly ahh verdammt, danke dir .inl steht für "inline" oder welche Bedeutung hat das?
-
@drummi sagte in Template Linker-Fehler in Release-Build:
@firefly ahh verdammt, danke dir .inl steht für "inline" oder welche Bedeutung hat das?
Ja, das soll es heißen. Ist aber nur ein Name und hat keine technische Bedeutung.
-
Dieser Beitrag wurde gelöscht!
-
@SeppJ sagte in Template Linker-Fehler in Release-Build:
@drummi sagte in Template Linker-Fehler in Release-Build:
@firefly ahh verdammt, danke dir .inl steht für "inline" oder welche Bedeutung hat das?
Ja, das soll es heißen. Ist aber nur ein Name und hat keine technische Bedeutung.
Jo eine kurze suche hat ergeben, dass auch folgende wohl genutzt werden (neben .inl).
- .icc
- .tcc
- .txx
- .tpp
Quellen:
https://stackoverflow.com/questions/29264656/c-template-implementation-file-extension-convention
https://filebox.ece.vt.edu/~ECE2574/faq.html
-
@SeppJ sagte in Template Linker-Fehler in Release-Build:
@drummi sagte in Template Linker-Fehler in Release-Build:
@firefly ahh verdammt, danke dir .inl steht für "inline" oder welche Bedeutung hat das?
Ja, das soll es heißen. Ist aber nur ein Name und hat keine technische Bedeutung.
Was übrigens - wenn man es genau nimmt - für alle Quellcode-Dateien gilt. Daher ist "Template-Definitionen nicht in
.cpp
" auch nur eine simple Faustregel.Korrekt müsste es eigentlich eher heissen, dass Code, der ein Template instantiiert, entweder die Definition "sehen" können muss (z.B. via
#include
oder sie befindet sich in der selben Datei), oder dass der Objektcode für die verwendeten Template-Instanzen anderweitig mit reingelinkt werden muss.Für den Anfang reicht aber erstmal nur die Faustregel "Definition nicht in
.cpp
"
-
@Finnegan sagte in Template Linker-Fehler in Release-Build:
Für den Anfang reicht aber erstmal nur die Faustregel "Definition nicht in
.cpp
"Dadurch vermeidet man, dass automatische build tools aus versehen die template definitionens dateien zum dem set der dateien hinzufügt auf die der compiler losgelassen werden soll
-
@firefly sagte in Template Linker-Fehler in Release-Build:
@Finnegan sagte in Template Linker-Fehler in Release-Build:
Für den Anfang reicht aber erstmal nur die Faustregel "Definition nicht in
.cpp
"Dadurch vermeidet man, dass automatische build tools aus versehen die template definitionens dateien zum dem set der dateien hinzufügt auf die der compiler losgelassen werden soll
Das auch. Aber wenn die bei mir in einer
.cpp
stehen (was nur extrem selten und in besonderen Fällen vorkommt), dann sollen sie auch kompiliert werden. Eben weil die.cpp
auch noch die spezifischen Instantiierungen enthält, die dann woanders mitgelinkt werden.