Ich habe ein sehr seltsames Problem mit dem GCC 5.4.0 Linker. Ich habe diese Dateien:Header-only-Klasse + Undefinierter Verweis auf Funktion NUR WENN Rückgabeobjekt dieser Klasse
spline.h
, utils.h/cpp
, main.cpp
spline.h
ist ein Kopf nur Utility-Klasse für Befestigungspunkte auf Splines.
1) Ich erstelle eine Bibliothek mit utils.cpp und CMake:
add_library(utils_lib utils.cpp)
utils.h
#include
ist spline.h
ing.
2) Ich eröffne mein binär aus main.cpp
:
add_executable(hello_world main.cpp)
target_link_libraries(hello_world utils_lib)
3) Innerhalb utils.cpp
, ich habe diese Funktion:
tk::spline fitSpline(const std::vector<double>& x,
const std::vector<double>& y)
{
tk::spline output;
output.set_points(x,y);
return output;
}
Also, wenn ich versuche, diese Funktion innerhalb main.cpp
zu verwenden:
auto my_spline = fitSpline(x,y);
Dann bekomme ich diesen Linker Fehler:
undefined reference to `fitSpline(std::vector<double, std::allocator<double> > const&, std::vector<double, std::allocator<double> > const&)'
Allerdings, wenn ich den Rückgabewert von fitSpline
-double
zum Beispiel ändern:
double fitSpline(const std::vector<double>& x,
const std::vector<double>& y)
{
tk::spline output;
output.set_points(x,y);
return 0.0;
}
Dann mehr ich nicht die Linker-Fehler erhalten! Es kompiliert einfach gut. Ich verstehe wirklich nicht, was das Problem ist, irgendwelche Hinweise?
Danke!
Gibt es eine vorhandene Funktionssignatur für 'fitSpline' in' utils.h'? Nur das, was mir gerade einfällt. Wenn möglich, poste den entsprechenden Code in 'utils. *' Und 'main.cpp'. – hnefatl
@hnefatl Ja, die Signatur ist da. Wie ich schon sagte, wenn ich nur den Rückgabewerttyp ändere, funktioniert alles gut. Ich habe gerade festgestellt, dass "spline.h" alles in einem anonymen Namensraum hat, sicher muss das der Grund sein! Muss ich es dann in jede cpp-Datei aufnehmen? – user1011113
Wenn sie wirklich in einem [anonymen Namespace] sind (https://stackoverflow.com/questions/154469/unnamed-anonymous-namespaces-vs-static-functions), sollte nichts außerhalb der Datei auf sie zugreifen können. Mit Signatur wollte ich fragen, ob Sie eine Split-Definition und Implementierung der Funktion hatten, und vergessen, eines von ihnen zu aktualisieren. Ein 'spline.h' in' main.cpp' könnte helfen, aber ich kann nicht wirklich herausfinden warum. Das Posten von mehr Code würde helfen. – hnefatl