LinuxでIntel C / C ++コンパイラを使用して、Windowsでリンクされるオブジェクトファイルを作成することは可能ですか?


12

どうして?

ソースにもよりますが、Intelコンパイラは、x86アーキテクチャ用の最速の実行可能ファイルを生成するコンパイラである可能性が最も高いです(5〜100%の実行時間の改善)。

IntelはLinux向けのコンパイラを非商用ライセンスで無料で提供しています(Intel-Non-Commercial Software Developmentのページのどこかで無料だと思います)。学生向けの無料の非商用ライセンスもありますが、3つの主要なオペレーティングシステムすべてにツールが提供されていますが、このライセンスは適用されません(評判の制限によりリンクが削除されました)。

ゴール

私(非学生として)は、非商用ライセンスの下でインテルコンパイラを使用して実行速度を向上させ、Windows(および場合によってはOSバツ)

詳細:

このドキュメントから推測したことは、Intelコンパイラはプラットフォームの主要なコンパイラと互換性のあるオブジェクトファイルを作成するということです。

サブ質問:

  1. WindowsおよびLinux(現在のバージョン)のgcc、g ++、cl、mingw32、icc、icpc、iclのオブジェクトファイル形式は何ですか?
  2. mingw32クロスコンパイラツールチェーンの一部を使用して目標を達成できますか?
  3. 生成されたオブジェクトファイルのメタデータが主な問題だと思いますか?

ad 2:
mingw32-objcopyは、Linux(おそらくELF)上のIntelコンパイラ出力をMicrosoft互換のCOFFに変換できるようです(ただし、再配置可能なオブジェクトファイルの例外があります)。誰かがこれが実際に機能することを確認できますか(重要でないアプリケーションの場合)、お願いします。


1
+1。興味深い質問。
ニール

ワインを調べましたか?知る限りでは、WineはLinux上でWindows実行可能ファイルを構築できるツールチェーンを提供します。おそらく、あなたはそれでiccをフックすることができます。また、Wine内でWindows iccを実行し、ming32クロスコンパイルツールチェーンと接続することで成功するかもしれません。私はそれを試していませんが、十分にいじって、それが可能であるべきだと思います。
-tdammers

よると@tdammers WineHQ私は間違っていないです場合は、Linux上でWindowsの実行ファイルを構築するためのツールチェーンは、MINGW32です。
ヒューゴ

Intelフォーラムからの答えは「いいえ」のようです:software.intel.com/en-us/forums/topic/282588
Vitor Py

@VitorBraga私はこの質問を次のように解釈しました。「インテル®コンパイラーは直接クロスコンパイルできますか?」答えは「いいえ」(必要なオプションとライブラリが不足していることを私が知る限りではありません)ですが、...コンピュータアーキテクチャ(IA32、AMD64)は私の場合とWindowsライブラリのみを使用する場合は同じですLinuxでプログラムをコンパイルするには、Windows実行可能ファイルを作成するためにWindowsライブラリとリンクされている場合、Windowsで実行できる実行可能コードを取得する必要があります。
ヒューゴ

回答:


1

クロスコンパイラを使用して、Linuxビルドマシン上でWindows実行可能ファイルを作成することができます。しかし、Intel そのようなクロスコンパイラを提供していません

サブ質問に回答するには:

WindowsおよびLinux(現在のバージョン)のgcc、g ++、cl、mingw32、icc、icpc、iclのオブジェクトファイル形式は何ですか?

オブジェクトファイルの形式は、オペレーティングシステム(または、ビルドに使用されたコンパイラ)によって効果的に決定されます。Windowsの場合、これはPortable Executable(PE)形式であり、Linuxの場合はELF形式です。

mingw32クロスコンパイラツールチェーンの一部を使用して目標を達成できますか?

いいえ。関連する部分はコードジェネレーターです。これは、正しいオブジェクト形式を生成する部分と、生成されたコードにスピードエッジを与えるインテルコンパイラーの部分の両方です。

生成されたオブジェクトファイルのメタデータが主な問題だと思いますか?

いいえ。それは1つの問題ですが、他にもあります。より根本的な問題は、パラメータがカーネルや標準ライブラリに渡される方法の潜在的な違いです。IIRC、これらの規則はWindowsとLinuxで異なります。


0

答えはほぼ間違いなく「はい」です。Windowsバイナリのクロスコンパイル(Linuxボックスで mingw32)をgccを使用して簡単にます-もちろん(Wineで動作しない限り)Linuxでプログラムを実行することはできませんが、 Windowsバイナリはこの方法で。

ただし、Intelコンパイラにこのオプションがあるかどうかはわかりませんが、あると思います。

LinuxのELFに対して、Windowsのオブジェクト形式はPEです。


msdnによると:「コンパイラは、共通オブジェクトファイル形式(COFF)オブジェクト(.obj)ファイルを生成します。」<br/>
Hugo

OK、うまくいきませんでした。ウィキペディアによると、PEはCOFFから派生しており、両方のファイル形式をオブジェクトファイル形式と実行可能ファイル形式として使用できます。
ヒューゴ

0

Microsoftのカスタム呼び出し規則を使用する(直接)何にもリンクしないCコードでは、MinGWの objcopy。アセンブルされたオブジェクトファイルを変換するために使用しましたが、呼び出し規約について心配する必要はありませんでした。

GCCまたはclangにあなたが望むことを正確に実行させる代わりに、あなたがこれをしようとする時間を費やすだけです。このような高速化が本当に重要な場合は、IntelコンパイラーでLinuxバイナリをコンパイルし、コードの高速化が行われるとしたら、それを正確に確認してください。他のすべてが失敗した場合、アセンブリにパッチを適用できます。


0

私は次の答えを提案します:

確かに多分(はいに向かっている)が、コンテキストに関して。

説明:「学習」部分について:これを試すのは時間の無駄ではないようですが、(「プット」部分)この答えを考慮に入れるをすると、Intelと比較して実行時間の改善が得られない可能性があります-ツールチェーンのみ。関連する部分は、リンカおよびコンパイラへのランタイムフィードバックです(プログラム全体の最適化、プロファイルに基づく最適化、リンク時コード生成)。

追加の詳細:MinGW FAQ
よると、ライブラリとDLLの使用に問題がある可能性があります:「dll は異なるWindowsコンパイラ間でかなり移植可能であるはずですが、ライブラリファイル(.libまたは.a)を介してdllにアクセスすることはできません。ファイル形式は特定のコンパイラーに固有であり、コンパイラーがサポートを提供しない限り、異なるコンパイラーで移植可能に使用することはできません。」

回答を完了するには、
サブ質問1:

WindowsおよびLinux(現在のバージョン)のgcc、g ++、cl、mingw32、icc、icpc、iclのオブジェクトファイル形式は何ですか?

Windows上のコンパイラのデフォルトのオブジェクトファイル形式はCOFF(おそらくPEバリアント)です。Linux上のコンパイラのデフォルトのオブジェクトファイル形式はELFです

サブ質問2:

mingw32クロスコンパイラツールチェーンの一部を使用して目標を達成できますか?

ほとんどの場合、はい(リンク部分について)ですが、ほとんどの場合、実行時間の大幅な改善は得られません。

サブ質問3:

生成されたオブジェクトファイルのメタデータが主な問題だと思いますか?

リンクについて:はい。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.