Warum?
Abhängig von Ihrer Quelle ist es wahrscheinlich, dass der Intel-Compiler die schnellsten ausführbaren Dateien für die x86-Architektur generiert (Verbesserung der Ausführungszeit um 5 bis 100%).
Intel bietet seine Compiler für Linux unter einer nichtkommerziellen Lizenz kostenlos an (ich glaube, ich habe gelesen, dass sie irgendwo auf ihrer Seite kostenlos sind: Intel - Non-Commercial Software Development ). Es gibt auch eine kostenlose nichtkommerzielle Lizenz für Studenten, diese Lizenz gilt jedoch nicht, obwohl Tools für alle drei Hauptbetriebssysteme angeboten werden (Link aufgrund von Reputationsbeschränkungen nicht verfügbar).
Tor
Ich (als Nicht-Student) möchte die Intel-Compiler für mögliche Verbesserungen der Ausführungsgeschwindigkeit unter der nicht-kommerziellen Lizenz verwenden können, um Objektdateien zu kompilieren, die verknüpft werden können, um ausführbare Dateien und dynamische Verknüpfungsbibliotheken für Windows (und möglicherweise das Betriebssystem) zu erstellen X)
Mehr Details:
Aus diesem Dokument habe ich abgeleitet, dass die Intel-Compiler Objektdateien erstellen, die mit den dominierenden Compilern der Plattform kompatibel sind.
Unterfragen:
- Was sind die Objektdateiformate von gcc, g ++, cl, mingw32, icc, icpc und icl unter Windows und Linux (aktuelle Versionen)?
- Können Teile der Cross-Compiler-Toolchain von mingw32 verwendet werden, um das Ziel zu erreichen?
- Habe ich recht, dass die Metadaten in den generierten Objektdateien das Hauptproblem sind?
Zu 2:
mingw32-objcopy scheint in der Lage zu sein, die Intel-Compiler-Ausgabe unter Linux (vermutlich ELF) in Microsoft-kompatibles COFF zu konvertieren (mit der möglichen Ausnahme von verschiebbaren Objektdateien). Könnte jemand bestätigen, dass dies tatsächlich funktioniert (für nicht-triviale Anwendungen), bitte?
Antworten:
Mit einem Cross-Compiler können auf einem Linux-Buildcomputer ausführbare Windows-Dateien erstellt werden. Intel bietet solche Cross-Compiler jedoch nicht an .
So beantworten Sie die Unterfragen:
Das Format für die Objektdateien wird effektiv vom Betriebssystem (oder vielmehr vom Compiler, mit dem sie erstellt wurden) bestimmt. Für Windows ist dies das PE- Format (Portable Executable) und für Linux das ELF- Format.
Nein. Der relevante Teil ist der Codegenerator, der sowohl für die Generierung des richtigen Objektformats als auch für den Teil auf den Intel-Compilern verantwortlich ist, der dem generierten Code den Geschwindigkeitsvorsprung verleiht.
Nein, es ist ein Problem, aber es gibt noch mehr. Ein grundlegenderes Problem ist der mögliche Unterschied bei der Übergabe von Parametern an den Kernel und / oder die Standardbibliothek. IIRC unterscheiden sich diese Konventionen zwischen Windows und Linux.
quelle
Die Antwort lautet mit ziemlicher Sicherheit ja. Ich weiß, dass das Cross-Kompilieren von Windows-Binärdateien (über mingw32 ) auf einer Linux-Box mit gcc leicht möglich ist - offensichtlich können Sie das Programm nicht unter Linux ausführen (es sei denn, es funktioniert unter Wine), aber ich kenne mehrere Programme, die es bekommen Windows-Binärdateien auf diese Weise.
Ich weiß jedoch nicht, ob der Intel-Compiler die Optionen dafür hat, ich sollte denken, dass dies der Fall ist.
Das Objektformat für Windows ist PE , für Linux ist es ELF .
quelle
Mit C-Code, der (direkt) mit nichts verknüpft ist, das die benutzerdefinierten Aufrufkonventionen von Microsoft verwendet, haben Sie möglicherweise eine Chance, MinGWs zu verwenden
objcopy
. Ich habe damit eine zusammengesetzte Objektdatei konvertiert, musste mich dann aber nicht um das Aufrufen von Konventionen kümmern.Ich würde nur die Zeit verbringen, die Sie versuchen würden, dies zu tun, anstatt GCC oder Clang dazu zu bringen, genau das zu tun, was Sie wollen. Wenn eine solche Beschleunigung wirklich so wichtig ist, kompilieren Sie eine Linux-Binärdatei mit dem Intel-Compiler und versuchen Sie herauszufinden, was genau, wenn überhaupt, Ihren Code beschleunigt. Sie können die Assembly patchen, wenn alles andere fehlschlägt.
quelle
Ich schlage folgende Antwort vor:
Ein definitives Vielleicht (in Richtung Ja) mit einem Aber in Bezug auf den Kontext.
Erläuterung: In Bezug auf den "lehnenden" Teil: Es scheint keine reine Zeitverschwendung zu sein, dies zu versuchen, aber wenn Sie diese Antwort berücksichtigen , werden Sie wahrscheinlich keine Verbesserungen der Ausführungszeit im Vergleich zu einem Intel erhalten -nur Toolchain. Der relevante Teil ist das Linker- und Laufzeit-Feedback an den Compiler (vollständige Programmoptimierung, profilgesteuerte Optimierung, Link-Time-Code-Generierung).
Zusätzliches Detail:
Laut der MinGW-FAQ gibt es mögliche Probleme bei der Verwendung von Bibliotheken und DLLs:
"Obwohl DLLs auf verschiedenen Windows-Compilern ziemlich portabel sein sollen, ist dies beim Zugriff auf DLLs über eine Bibliotheksdatei (.lib oder .a) nicht der Fall Dateiformate sind spezifisch für bestimmte Compiler und können nur dann portabel mit anderen Compilern verwendet werden, wenn der Compiler dies unterstützt. "
Um die Antwort zu vervollständigen:
Unterfrage 1:
Das Standard-Objektdateiformat für jeden Compiler unter Windows ist COFF (wahrscheinlich die PE- Variante). Das Standard-Objektdateiformat für jeden Compiler unter Linux ist ELF
Unterfrage 2:
Höchstwahrscheinlich ja (für den Verknüpfungsteil), aber höchstwahrscheinlich werden Sie keine wesentliche Verbesserung der Ausführungszeit erzielen.
Unterfrage 3:
Bezüglich der Verlinkung: ja.
quelle