FRAGE ZU: #pragma comment (lib, "winmm.lib")

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
IlikeMyLife
Establishment
Beiträge: 212
Registriert: 08.05.2011, 09:59
Benutzertext: Feel Free

FRAGE ZU: #pragma comment (lib, "winmm.lib")

Beitrag von IlikeMyLife »

Ich habe eben gelesen, dass
#pragma comment (lib, "winmm.lib")
nur unter dem MS Visual Studio funktioniert und sich der Quellcode nicht auf Linux portieren lässt dadurch.

Hier meine Frage:

kann ich, wenn ich
#include <ctime>
#include <cstdlib>
einbinde, nicht den selben effekt erreichen?

in folgendem Beispiel funktioniert es. Aber was ist bei größeren Projekten. Gibt es etwas zu beachten?:

Code: Alles auswählen

#include <ctime>
#include <cstdlib>

int main()
{
    int min=10000;
    int max=99999;

    srand((unsigned int)time(0)); //Setzt den Startwert für rand(), abhängig von der Zeit

    int zz=rand()%(max-min+1)+min; //Berechnung der Zufallszahl im gewünschten Bereich

    return 0;
}
Youka
Beiträge: 28
Registriert: 20.04.2011, 18:24
Wohnort: Darmstadt

Re: FRAGE ZU: #pragma comment (lib, "winmm.lib")

Beitrag von Youka »

IlikeMyLife hat geschrieben:Ich habe eben gelesen, dass
#pragma comment (lib, "winmm.lib")
nur unter dem MS Visual Studio funktioniert und sich der Quellcode nicht auf Linux portieren lässt dadurch.
pragma ist auch für gcc vorhanden, allerdings, soweit ich weiß, keine Linker-Option.
IlikeMyLife hat geschrieben:kann ich, wenn ich
#include <ctime>
#include <cstdlib>
einbinde, nicht den selben effekt erreichen?
pragma comment (lib, ...) linkt eine Bibliothek. Mit deinen includes bindest du nur Standard-Header ein, dessen Bibliotheken vom Compiler schon automatisch erkannt und gelinkt werden.
IlikeMyLife
Establishment
Beiträge: 212
Registriert: 08.05.2011, 09:59
Benutzertext: Feel Free

Re: FRAGE ZU: #pragma comment (lib, "winmm.lib")

Beitrag von IlikeMyLife »

hoffe ich verstehe das jetzt richtig...

dann ist nur die winmm.lib damit gemeint, die nicht innerhalb der linux-umgebung vertreten ist, allerdings der #pragma befehl selbst schon.

wenn ich also die <ctime> und die <cstdlib> includiere, werden die Bibliotheken dahinter mit gelinkt was letzten endes keinen unterschied macht.

zu beachten habe ich in diesem punkt also nur, dass ich den kompletten funktionsumfang NUR habe, wenn ich die komplette Bibliothek einfüge, so lange ich nur <ctime> und die <cstdlib> halt nur den verminderten funktionsumfang und nicht den, der kompletten Bibliothek.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: FRAGE ZU: #pragma comment (lib, "winmm.lib")

Beitrag von dot »

Wenn du etwas #includest dann tust du nur includen. Mit linken hat das nichts am hut. Da wird nur ein Header eingebunden, das wars. #pragma an sich ist eine Standarddirektive. Aber die einzelnen pragmas, wie z.B. comment sind vollkommen implementierungsabhängig.
Der C++ Standard sagt nur, dass es #pragma gibt, nicht was #pragma so alles tun kann oder wie einzelne pragmas genau auszusehen haben. Der C++ Standard sagt auch, dass ein Compiler ein #pragma das er nicht kennt ignorieren muss.
#pragma comment(lib, ...) ist eine Visual C++ spezifische Sache, die einen Verweis auf die angegebene Bibliothek im Objectfile, das gerade kompiliert wird, ablegt. Die entsprechenden Header musst du trotzdem noch einbinden (was du im konkreten Fall vermutlich mit #include <windows.h> machst). Im Prinzip ist #pragma comment(lib, ...) so, als hättest du die Bibliothek in den Linkereinstellungen als zusätzliche Abhängigkeit eingetragen, was imo die sehr viel bessere Lösung wäre. Wenn du mich fragst, gehört sowas ins Buildsystem und nicht in den Code...
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: FRAGE ZU: #pragma comment (lib, "winmm.lib")

Beitrag von Krishty »

Jein – du musst dir klar werden, dass es zwei Möglichkeiten gibt, fremde Programme in deine eigenen einzubinden: Zum einen, indem du ihren Quelltext erneut übersetzt und zum anderen, indem du übersetzten Quelltext mit deinem eigenen verbindest.

Ersteres passiert, wenn du #include benutzt (dann wird der komplette Header zu deinem eigenen Quelltext kopiert); zweiteres, wenn du eine Bibliothek referenzierst (dann wird die LIB-Datei oder, im Falle einer dynamischen Bindung, die DLL-Datei (Dateierweiterungen Windows-spezifisch) mit dem Maschinentext deines Programms verbunden).

Für den zweiten Weg gibt es keine plattformunabhängige Möglichkeit, da sie immer Compiler- und Umgebungsabhängig ist. Das #pragma ist lediglich eine Garantie, dass es unter Visual Studio funktioniert und dass andere Compiler nur eine Warnung ausgeben, wenn sie darüber stolpern, aber noch lange nicht das tun müssen, was Visual Studio tut.

Der erste Weg wird immer populärer, weil Header-only-Bibliotheken halt so gut wie Null Migrationszeit benötigen, dafür aber die Kompilierzeit enorm steigern können.

Obwohl <ctime> und <cstdlib> wie eine Header-only-Bibliothek aussehen, sind sie es nicht: Sie enthalten nur Deklarationen und die eigentliche Implementierung der Funktionalität befindet sich in einer Fremdbibliothek, die so ziemlich alles Grundlegende enthält, um ein C/C++-Programm lauffähig zu machen (z.B. die Speicherallokations- uns Ausnahmebehandlungsroutinen, die du nicht selber schreiben müssen willst). Die nennt man C- / C++-Runtime Library (CRT) und weil man sie eben für so ziemlich jedes Programm braucht, verbinden Compiler sie automatisch mit jedem neuen Projekt, das du anlegst. Das tun sie ganz unabhängig davon, ob du ein #include einsetzt oder nicht.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: FRAGE ZU: #pragma comment (lib, "winmm.lib")

Beitrag von eXile »

Ich wollte nur noch kurz einstreuen, dass #pragma comment(lib, …) ein integrationstechnischer Albtraum ist, wenn man mehrere Projekte zusammenbringen möchte. Im schlechtesten Falle muss man das gesamte Kreuzprodukt aus (_SECURE_SCL=0, _SECURE_SCL=1) × (Debug, Release) × (x86, x64) kompilieren – und dabei natürlich immer gegen die korrekten Bibliotheksversionen linken. Wenn nun ein Horst irgendwo in den tiefsten Tiefen ein #pragma comment(lib, …) versteckt, und natürlich immer gegen die gleiche Library linken will, sind die Linkerprobleme schon vorprogrammiert. Außerdem forciert man dadurch andere Projekte auf einen bestimmten Ausgabedateinamen (welche dazu noch alle möglichen Kombinationen aus „d“-, „32“- oder „64“-Suffixen benutzen); das geht mal gar nicht.

Das ist vielmehr Aufgabe des Build-Systems. Also entweder manuelle Konfiguration mittels Visual Studio oder mittels cmake.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: FRAGE ZU: #pragma comment (lib, "winmm.lib")

Beitrag von dot »

eXile hat geschrieben:Das ist vielmehr Aufgabe des Build-Systems.
+2 :ugeek:
Antworten