C++,SFML LNK2001 Problem
-
Guten Tag,
Ich will ein ganz simples Fenster erzeugen:
#include <iostream> #include <SFML\Graphics.hpp> int main() { sf::RenderWindow fenster(sf::VideoMode(800, 600, 32), "lel", sf::Style::Titlebar); while (fenster.isOpen()) { fenster.clear(); fenster.display(); } }
Wenn ich meinen code jedoch ausführen möchte kommen zig Fehlermeldungen mit dem Code LNK2001:
http://puu.sh/lJFRH/2d698bc8aa.png
Habe Visual Studio 2014, habe ein 64 Bit Windows Sytem, eine 32 bit Konsolenanwendung erstellt und eine 32 Bit Version von SFML eingebunden.
Was kann ich tun?
-
Hast du auch die SFML-Libs bei den Linkeroptionen eingetragen?
s.a. [Anfänger] SFML Window Tutorial - kein Fenster (die Beschreibung des Threaderstellers).
-
-
Das hier hast Du gesehen: http://www.sfml-dev.org/tutorials/2.0/start-vc.php und befolgt?
Insbesondere, weil Du offensichtlich die statischen libs ("sfml-xxx-s-d.lib", "sfml-xxx-s.lib")linkst?
Da wird noch was von einem Präprozessormakro erzählt...
-
Okay habe jetzt nochmal alles schritt für schritt so gemacht. Wenn ich das Programm nun starte kommen folgende Fehlermeldungen:
http://puu.sh/lK5rO/110bfd76b1.png
http://puu.sh/lK5up/cae33d3619.png
http://puu.sh/lK5v1/5e8467bbfa.png
-
hannes243 schrieb:
Okay habe jetzt nochmal alles schritt für schritt so gemacht. Wenn ich das Programm nun starte kommen folgende Fehlermeldungen:
http://puu.sh/lK5rO/110bfd76b1.png
http://puu.sh/lK5up/cae33d3619.png
http://puu.sh/lK5v1/5e8467bbfa.pngIch zitiere mal aus obigen Link:
"Now compile the project, and if you linked to the dynamic version of SFML, don't forget to copy the SFML DLLs (they are in <sfml-install-path/bin>) to the directory where your compiled executable is."
Dran gedacht?
-
AHHHH vielen vielen dank Furble Wurble ^^ Endlich funktioniert es :)!
-
hannes243 schrieb:
AHHHH vielen vielen dank Furble Wurble ^^ Endlich funktioniert es :)!
Gerngeschehen.
Das kopieren der dlls ist aber ziemlich primitiv.
"Richtiger" ist wohl eine Pfad variable anzupassen. Siehe hier:
https://msdn.microsoft.com/en-us/library/669zx6zc.aspx
Wahrscheinlich Library Directories.Aber das ist die Kür...
Viel Erfolg bei der Spieleprogrammierung!
-
Noch eine Ergänzung:
Scheinbar wurde das Problem hier gelöst, indem statt SFML statisch zu linken, auf dynamisches linken ausgewichen wurde. Diese Lösung ist vollkommen in Ordnung, wenn es egal ist, ob SFML statisch oder dynamisch eingebunden wird (und im letzteren Fall von den SFML-DLLs abhängig ist), allerdings löst es nicht das ursprüngliche Problem der nicht auflösbaren Symbole bei statischem Linken.Der Grund hierfür ist, dass SFML selbst auch wieder von weiteren Bibliotheken abhängig ist (z.B. deren Funktionen aufruft), wie in diesem Fall (wenn mich nicht alles täuscht) von einer statischen Variante der IJG JPEG-Bibliothek. Damit diese Symbole aufgelöst werden können, muss bei statischem Linken diese (so etwas wie jpeg-s.lib o.ä.) ebenfalls, zusätzlich zu
sfml-graphics-s.lib
eingebunden werden. Bei__imp_glBindTexture
fehlt warscheinlich analog dazu dieopengl32.lib
bei den Linker-Option.Üblicherweise enthalten statische Bibliotheken die Funktionen/Symbole der Bibliothek selbst, nicht aber diejenigen von weiteren Bibliotheken, die genutzt werden. Diese müssen dem Linker dann ebenfalls zur Verfügung gestellt werden, indem man diese Bibliotheken ebenfalls einbindet - schließlich kann der Linker nur dann eine exe-Datei zusammenstricken, wenn alle Funktionen/globale Variablen die im Programm direkt oder indirekt verwendet werden auch auffindbar sind.
Dynamisches Linken funktioniert hier, da die Bibliothek in diesem Fall nur einen Verweis auf die jeweilige Funktion enthält und im Programm nachher dem Betriebssystem überlassen wird, diese in der jeweiligen DLL-Datei aufzufinden. Bei statischem linken muss jedoch der Objekt-Code ("kompilierte Funktion") der Funktion verfügbar sein, da dieser dann direkt in die exe-Datei eingebaut wird (statt nur ein externer DLL-Verweis).
Gruss,
Finnegan
-
Gibt es schon DLLs zum Download für die x64 Version von MS VC++ 2015? Musste alles selbst zusammenbasteln und kompilieren, Audio klappt leider noch nicht.