error LNK2019
-
Ok, also die genaue Fehlermeldung ist:
GUIManager.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: class valvesim::io::ProjectfileReader * __thiscall valvesim::controller::Controller::getProjectfileReader(void)" (?getProjectfileReader@Controller@controller@valvesim@@QAEPAVProjectfileReader@io@3@XZ)" in Funktion ""public: static int __cdecl sofa::gui::GUIManager::createGUI(class sofa::simulation::Node *,char const *,class valvesim::controller::Controller *)" (? createGUI@GUIManager@gui@sofa@@SAHPAVNode@simulation@3@PBDPAVController@controller@valvesim@@@Z)".- Templates verwende ich an den beteiligten Funktionen nicht.
- Definiert sind diese Funktionen definitiv. Ich kann sie jedenfalls anderer Stelle/ im gleichen Projekt benutzen.
- Daran wird es wohl liegen. Also ich erstelle das Projekt VS. Die dabei erzeugte .lib kann ich ja ohne Probleme im Windows-Explorer einsehen und somit den Pfad richtig im zweiten Projekt unter zusätzliche Abhängigkeiten setzen.
Muss ich in den Projekteinstellungen vielleicht irgendwelche besonderen Einstellungen vornehmen, damit andere Projekte deren Funktionen nutzen können?
Momentan ist es so, dass der Konfigurationstyp auf "Anwendung .exe" gestellt ist, damit ein lauffähiges Programm erzeugt wird. Behagt sich das vielleicht irgendwie? Das andere Projekte nicht auf solche Libs zugreifen können?
-
ok ich bin dem Ganzen vielleicht etwas mehr auf die Schliche gekommen.
#ifndef SOFA_GUI_SOFAGUI_H #define SOFA_GUI_SOFAGUI_H #include ... #ifdef SOFA_BUILD_SOFAGUI # define SOFA_SOFAGUI_API SOFA_EXPORT_DYNAMIC_LIBRARY #else # define SOFA_SOFAGUI_API SOFA_IMPORT_DYNAMIC_LIBRARY #endif namespace sofa { namespace gui { class SOFA_SOFAGUI_API SofaGUI { public: ...Kann mir einer genauer erklären, was der #ifdef SOFA_BUILD_SOFAGUI Teil machen? Wo genau wird SOFA_BUILD_SOFAGUI definiert?
Dieser Ausschnitt ist von mit programmiert, sondern vom http://www.sofa-framework.org/, das ich benutze.
Wahrscheinlich muss ich sowas in der Art auch bei meinen selbst geschrieben Klassen machen, damit ich von anderen Projekten aus auf diese korrekt (ohne Linker Fehler) drauf zugreifen kann.(!?)
Oder kennt einer gute Referenzen dazu mit guten Beispielen.
Ich habe hier einen dicken Wälzer zu C++, aber da steht leider 0 zum richtigen Umgang .dll und co.
Die Microsoft Hilfe bringt mir da auch nicht wirklich was.Sven
-
icewater schrieb:
Leider läuft mir mal wieder der LNK2019 Error über den Weg, lässt sich diesmal nicht so einfach durch googeln beseitigen.
... kommt es zu einem LNK2019 error ...
Normalerweise hätte ich jetzt so etwas gesagt wie: "Du hast wahrscheinlich die one-definition-rule verletzt. Probier es doch mal stattdessen mit Lesen und Verstehen solcher Sachen, wie sie in schlauen C++ Büchern stehen."
Aber dein Problem ist doch ein anderes...
icewater schrieb:
ok ich bin dem Ganzen vielleicht etwas mehr auf die Schliche gekommen.
#ifndef SOFA_GUI_SOFAGUI_H #define SOFA_GUI_SOFAGUI_H #include ... #ifdef SOFA_BUILD_SOFAGUI # define SOFA_SOFAGUI_API SOFA_EXPORT_DYNAMIC_LIBRARY #else # define SOFA_SOFAGUI_API SOFA_IMPORT_DYNAMIC_LIBRARY #endif namespace sofa { namespace gui { class SOFA_SOFAGUI_API SofaGUI { public: ...Kann mir einer genauer erklären, was der #ifdef SOFA_BUILD_SOFAGUI Teil machen? Wo genau wird SOFA_BUILD_SOFAGUI definiert?
So etwas definiert man typischerweise beim Aufruf des Compilers als Parameter. Du hast ja hier sicherlich einen Header zitiert und dieser Header wird wahrscheinlich für zwei Sachen verwendet: Einmal zum Erzeugen einer dynamischen Bibliothek (Fall SOFA_BUILD_SOFAGUI) und einmal für das Programm, welches diese Bibliothek verwenden soll (sonst).
icewater schrieb:
Oder kennt einer gute Referenzen dazu mit guten Beispielen.
Ich habe hier einen dicken Wälzer zu C++, aber da steht leider 0 zum richtigen Umgang .dll und co.
Die Microsoft Hilfe bringt mir da auch nicht wirklich was.Microsoft ist da schon die richtige Adresse. Der C++ Sprachstandard kennt "DLLs und Co" gar nicht, deswegen wundert mich das auch nicht, dass du in C++ Büchern nichts findest ... zumindest in C++ Büchern, die reines C++ lehren und nicht auf Microsoft-spezifische Eigenheiten eingehen. Das liest du am besten bei Microsoft nach.
-
Für solche Probleme beim Einrcihten und Nutzen einer Bibliothek oder eines Frameworks sollte die Hersteller Seite eine Anlaufadresse sein.
[witzig]
In deinem Fall also das Sofa
[/witzig]
*höhö*
-
Ok danke für die Antworten.
Ich hab jetzt mal alles aus dem Projekt geschmissen und nur das Kernproblem drin behalten.
Kann mir einer sagen, was ich hinzufügen muss (Code oder Projekteinstellungen), damit der Linker an der Stelle:
controller->getProjectfileReader();
in
int GUIManager::createGUI(valvesim::controller::Controller* controller)
keine Fehler mehr wirft?Hier der Link zum Projekt https://dl.dropbox.com/u/15629242/code.zip
(nur noch 8 mb groß und man sollte sich recht schnell zurecht finden)Danke für die Mühe
-
Also tut mir ja leid aber da Projekt ist eine einzige Katastrophe. Du hast die Einstellungen nicht richtig, ich bekomme massenhaft Warnungen...
Und das Design verstehe ich gar nicht.Außderdem fehlt in GuiManager.cpp ein "#include <iostream>"
Du solltest dein Konzept nochmal überdenken.
Dein Problem ist, dass du "ValveSim" jetzt als exe erstellst, davor aber scheinbar als lib erstellt hast.
Diese alte lib ist hoffnungslos veraltet und deshalb ist das Symbol das dem Linker fehlt (welches in deinem Quellcode inzwischen definiert ist) in dieser lib NICHT definiert.
Ich habe das ganze zum Laufen gebracht indem ich ValveSim kurz als lib erstellt habe und die alte ersetzt habe..Aber ich würde dir raten das Konzept zu ändern

Ein Projekt dass manchmal als exe und manchmal als lib erstellt wird kann nicth richtig sein...
-
Ja ich weiß, das ist alles nicht so pralle.
Du hast bestimmt versucht, das Projekt mit einer anderen IDE als VS 2008 zu starten? Es geht aber nur mit VS 2008.
Das ist zwar an sich schon mal sehr bescheiden. Aber der SOFA Support meinte zu mir, dass es nicht so einfach anders geht.Zum anderen habe ich das Projekt von einem anderen übernommen, der 0 Programmierkenntnisse hatte.
Ich selbst habe vorher nur mit Java gearbeitet und bin praktisch in C++ mit diesem Projekt reingestolpert.Sorry für den Fehler mit dem iostream - zuviel weggeschnitten.
Also um mal zum Punkt zu kommen. Es gibt ein Projekt, aus dem eine exe erstellt wird
und dieses Projekt sollte am besten nur Klassen enthalten, die in keinem anderen Projekten benutzt werden. Richtig?Damit hab ich die abgespeckte Variante erst mal zum laufen bekommen. Ob das dann beim gesamten auch klappt, werde ich nachher mal schauen.
-
Es geht aber nur mit VS 2008
Ne auch VS 2010 geht

Hauptsache Visual Studio und nicht zu alt.Es gibt ein Projekt, aus dem eine exe erstellt wird und dieses Projekt sollte am besten nur Klassen enthalten, die in keinem anderen Projekten benutzt werden. Richtig?
Jein. Was du auf keinen Fall machen solltest ist das Projekt einmal als lib und einmal als exe zu erstellen. Entweder oder.
Wenn du eine Datei hast die von 2 Projekten gleichzeitig verwendet wird wäre das weniger schlimm, dann hast du wenigstens keine veralteten libs und diese rumkopiere
-
DarkShadow44 schrieb:
Es gibt ein Projekt, aus dem eine exe erstellt wird und dieses Projekt sollte am besten nur Klassen enthalten, die in keinem anderen Projekten benutzt werden. Richtig?
Jein. Was du auf keinen Fall machen solltest ist das Projekt einmal als lib und einmal als exe zu erstellen. Entweder oder.
Wenn du eine Datei hast die von 2 Projekten gleichzeitig verwendet wird wäre das weniger schlimm, dann hast du wenigstens keine veralteten libs und diese rumkopiere
Also bewusst hab ich niemals von exe zu lib oder anders herum gewechselt.
Aber egal, jetzt läuft das Projekt erstmal wieder. Danke für die ganzen Hinweise. Ich werde mir dann erstmal ein paar Gedanken über eine bessere Architektur machen und mich ggf noch etwas belesen.
-
Also bewusst hab ich niemals von exe zu lib oder anders herum gewechselt.
Ok dann haben die von denen du das Projekt hast gepfuscht

Naja Hauptsache du weißt jetzt worans lag
