Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

killmichnich

unregistriert

1

08.08.2013, 10:03

Visual Studio/SFML - statisch linken

Hallo Leute,

hab gleich noch einmal eine Frage: Ich versuche gerade für ein kleineres Spiel mein Programm komplett statisch zu linken. Bei SFML selbst ist mir das auch bereits gelungen, das funktioniert. Jedoch fehlen noch einige dll's, die (einfach so) dabei sind. Deshalb hab ich gegooglet und herausgefunden, dass man bei Projekteigenschaften -> C/C++ -> Codegenerierung den Wert von 'Laufzeitbibliothek' von Multithreaded-DLL (/MD) auf Multithreaded(/MT) umstellen soll, damit alles statisch gelinkt wird. Sobald ich das mach, krieg ich allerdings jede Menge Fehler angezeigt:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
sfml-graphics-s.lib(Texture.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-graphics-s.lib(Sprite.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-graphics-s.lib(Image.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-graphics-s.lib(Color.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-graphics-s.lib(Transformable.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-graphics-s.lib(RenderTarget.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-graphics-s.lib(RenderStates.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-graphics-s.lib(RenderWindow.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-graphics-s.lib(GLCheck.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-graphics-s.lib(TextureSaver.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-graphics-s.lib(Transform.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-graphics-s.lib(ImageLoader.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-graphics-s.lib(View.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-graphics-s.lib(Shader.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-window-s.lib(VideoMode.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-window-s.lib(Window.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-window-s.lib(VideoModeImpl.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-window-s.lib(GlContext.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-window-s.lib(WindowImpl.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-window-s.lib(InputImpl.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-window-s.lib(WglContext.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-window-s.lib(JoystickManager.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-window-s.lib(WindowImplWin32.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-window-s.lib(JoystickImpl.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-system-s.lib(String.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-system-s.lib(Err.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>sfml-system-s.lib(ThreadLocal.cpp.obj) : error LNK2038: Konflikt ermittelt für "RuntimeLibrary": Der Wert "MD_DynamicRelease" stimmt nicht mit dem Wert "MT_StaticRelease" in Course.obj überein.
1>LINK : warning LNK4098: Standardbibliothek "MSVCRT" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.
1>C:\Users\danie_000\documents\visual studio 2012\Projects\SFML-test\Release\SFML-test.exe : fatal error LNK1319: 27 Konflikte ermittelt

Ich kann mir ungefähr vorstellen, was die Fehler bedeuten, habe jedoch keine Ahnung, wie ich das hingebogen bekomme. Auch bei Google find ich dazu leider nicht viel. Hab schon diverses ausprobiert, jedoch funktioniert irgendwie nichts gescheit.

Hatte einer von euch schon mal so ein Problem? Jemand ne Ahnung, wie ich das lösen kann?

Danke

MfG Killmichnich

2

08.08.2013, 16:00

Hey,

ich hatte anfangs auch Probleme mit dem statischen linken.
bei mir hat es dann aber funktioniert, indem ich die SFML neu kompiliert habe (für den statischen build) und die Laufzeitbibliothek auf MD eingestellt gelassen habe.
Dan ist es bei mir gegangen, vielleicht klappt es bei dir ja auch so

Liebe Grüße

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

08.08.2013, 16:19

Mir dünkt, dass es ein extra Flag beim compiler gab, dass dynamisch gelinkt wird. Vielleicht muss das auch noch entfernt werden. Keine Ahnung, ob das überhaupt noch notwendig ist.

killmichnich

unregistriert

4

08.08.2013, 21:59

Hey,

ich hatte anfangs auch Probleme mit dem statischen linken.
bei mir hat es dann aber funktioniert, indem ich die SFML neu kompiliert habe (für den statischen build) und die Laufzeitbibliothek auf MD eingestellt gelassen habe.
Dan ist es bei mir gegangen, vielleicht klappt es bei dir ja auch so

Liebe Grüße

Okay das könnte funktionieren, da der Fehler ja offensichtlich was mit den sfml-libs zu tun hat. Frage dazu: Wie kann ich das denn selber neu kompilieren? ^^

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

08.08.2013, 23:58

Die erste Frage sollte sein: Wieso die Runtime statisch linken?

Abgesehen davon empfehle ich, die englische Version von Visual Studio zu benutzen, selbst wenn nur aus dem einfachen Grund, dass englische Compilerfehler bei google wesentlich mehr Treffer liefern... ;)

6

09.08.2013, 00:01

Du musst in den Ordner, in dem du die SFML liegen hast, gehen.
Dort gehst du in den build->vc2008 Ordner und öffnest die SFML.sln Datei mit Visual Studio.
Dann gehst du oben in den Build-Einstellungen auf den Build, den du generieren willst (in meinem Fall war das die "Relase static", für den Debug Modus kannst du du die entsprechende Debug Einstellung verwenden) und kompilierst das alles. Es kann sein dass du dabei auch ein paar Fehlermeldungen von OpenGL bekommst, die kannst du aber getrost ignorieren. Die erstellten libs kannst du dann im lib->vc2008 Ordner finden ;)
Du musst dann natürlich noch daran denken, die betroffenen Dateien zu ersetzten, oder den Pfad für die Bibliotheksverzeichnisse anzupassen :)

@TrommlBomml: Es existiert meines Wissens nach eine Fläg für den Debug Modus ... Ich habe diese aber (aus Unwissenheit) nie verwendet und es hat trotzdem funktioniert ^^

@Dot: Der Grund warum ich die SFML statisch gelinkt habe ist, dass es (unter 1.6 zumindest) zu Anzeigefehlern mit ATI Grafikkarten kommen kann (Das Bild bleibt einfach schwarz), was ich leider fest stellen musste als ich ein Spiel von meiner Freundin testen lassen wollten ... Peinliche Sache ;) ^^

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Ombalat« (09.08.2013, 00:09)


killmichnich

unregistriert

7

09.08.2013, 09:36

@Ombalat: Vielen Danke für die Anleitung. Allerdings funktioniert das ganze leider nur mit der Version 1.6. Ich wolltes mit 2.1 machen, nur um dann festzustellen, dass der Ordner 'build' garnicht existiert :O Krieg ich das trotzdem irgendwie hin?

@dot: weil ichs kann. Hintergrund kann ja eigentlich egal sein ^^ und wenns nur is um was zu lernen. Ich möchts halt einfach hinkriegen.

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

8

09.08.2013, 09:40

Hintergrund kann ja eigentlich egal sein ^^


Die Frage "warum willst du etwas machen" hat schon gute Gründe ;) Wenn du als Fragesteller nämlich sagst, was letztendlich dein Ziel ist, dann kann man dir auch vielleicht einfachere/bessere Wege zeigen um da hin zu kommen.
Die Antwort "um etwas zu lernen" ist aber natürlich auch völlig legitim :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

09.08.2013, 09:52

@dot: weil ichs kann. Hintergrund kann ja eigentlich egal sein ^^ und wenns nur is um was zu lernen. Ich möchts halt einfach hinkriegen.

Das mit dem Lernen und es hinbekommen Wollen ist absolut verständlich. Was das Problem ist, weißt du mittlerweile aber eh: Eine statische Library wird direkt in deine exe gepackt. Eine Library, die direkt in die exe soll, muss natürlich die selbe Runtime Library verwenden wie die Anwendung auch, denn ansonsten müsste die fertige exe zwei verschiedene Versionen der gleichen Library linken. In deinem Fall ist es aber so, dass die Anwendung die statische und die SFML Library die dynamische Runtime zu linken versucht oder umgekehrt. Und das geht natürlich net. Entweder du stellst also die Anwendung um, dass sie die selbe Runtime wie deine Version der SFML linked oder du kompilierst dir die SFML selbst in eine Version, die die selbe Runtime wie die Anwendung linked...

Auf jeden Fall hat schon seine Gründe, wieso die dynamische und nicht die statische Runtime die Standardeinstellung ist... ;)

killmichnich

unregistriert

10

09.08.2013, 15:30

Ahhhhh vielen dank dot, ich glaub ich habs endlich kapiert, wo der fehler ist :D
Ich hab leider damit selber noch ncih wirklich viel gemacht, deshalb hats ne weile gedauert bis es klack gemacht hat ^^

Ok was mich nochmal zu der Frage führt: Wie sfml 2.1 selber kompileren? Die Anleitung von Ombalat hat ja schon ahlbwegs gepasst, allerdings für ne andere Version. Und ich hab sowas auch noch nicht gemacht. Ich schätze mal das ist für andere libraries auch gleich? Sollte ich sowas nochmal machen wollen.

Werbeanzeige