Ist es möglich, den Intel C / C ++ - Compiler unter Linux zu verwenden, um Objektdateien zu erstellen, die unter Windows verknüpft werden sollen?


12

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:

  1. Was sind die Objektdateiformate von gcc, g ++, cl, mingw32, icc, icpc und icl unter Windows und Linux (aktuelle Versionen)?
  2. Können Teile der Cross-Compiler-Toolchain von mingw32 verwendet werden, um das Ziel zu erreichen?
  3. 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?


1
+1. Interessante Frage.
Neil

Haben Sie sich mit Wein befasst? AFAIK, Wine bietet eine Toolchain, die ausführbare Windows-Dateien unter Linux erstellen kann. Möglicherweise könnten Sie sich damit einverstanden erklären. Möglicherweise haben Sie auch einige Erfolge beim Ausführen eines Windows-ICC in Wine und können dies mit einer Ming32-Cross-Compilation-Toolchain verknüpfen. Ich habe es noch nicht ausprobiert, aber wenn ich genug herumspiele, denke ich, sollte es möglich sein.
tdammers

@tdammers Laut WineHQ ist die Toolchain zum Erstellen von ausführbaren Windows-Dateien unter Linux mingw32, wenn ich mich nicht irre.
Hugo

In den Intel-Foren scheint die Antwort "Nein" zu sein: software.intel.com/en-us/forums/topic/282588
Vitor Py

@VitorBraga Ich habe die Frage folgendermaßen interpretiert: "Kann der Intel Compiler direkt cross-compilieren?" Die Antwort lautet "Nein" (es fehlen die erforderlichen Optionen und Bibliotheken, soweit ich das beurteilen kann), aber ... die Computerarchitektur (IA32, AMD64) wäre in meinem Fall dieselbe und wenn ich nur Windows-Bibliotheken verwende Um das Programm unter Linux zu kompilieren, würde ich erwarten, ausführbaren Code zu erhalten, der unter Windows ausgeführt werden kann - wenn er mit den Windows-Bibliotheken verknüpft ist, um eine ausführbare Windows-Datei zu erstellen.
Hugo

Antworten:


1

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:

Was sind die Objektdateiformate von gcc, g ++, cl, mingw32, icc, icpc und icl unter Windows und Linux (aktuelle Versionen)?

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.

Können Teile der Cross-Compiler-Toolchain von mingw32 verwendet werden, um das Ziel zu erreichen?

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.

Habe ich recht, dass die Metadaten in den generierten Objektdateien das Hauptproblem sind?

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.


0

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 .


Laut msdn : "Die Compiler erstellen COFF-Objektdateien (Common Object File Format)." <br/>
Hugo

OK, das hat nicht funktioniert. Laut Wikipedia wird PE von COFF abgeleitet und beide Dateiformate können als Objektdateiformat und ausführbares Dateiformat verwendet werden.
Hugo

0

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.


0

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:

Was sind die Objektdateiformate von gcc, g ++, cl, mingw32, icc, icpc und icl unter Windows und Linux (aktuelle Versionen)?

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:

Können Teile der Cross-Compiler-Toolchain von mingw32 verwendet werden, um das Ziel zu erreichen?

Höchstwahrscheinlich ja (für den Verknüpfungsteil), aber höchstwahrscheinlich werden Sie keine wesentliche Verbesserung der Ausführungszeit erzielen.

Unterfrage 3:

Habe ich recht, dass die Metadaten in den generierten Objektdateien das Hauptproblem sind?

Bezüglich der Verlinkung: ja.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.