Apakah mungkin menggunakan kompiler Intel C / C ++ di Linux untuk membuat file objek yang akan ditautkan pada Windows?

12

Mengapa?

Bergantung pada sumber Anda, kompiler Intel kemungkinan atau paling pasti kompiler yang menghasilkan executable tercepat untuk arsitektur x86 (peningkatan waktu eksekusi 5 hingga 100%).

Intel menawarkan kompilernya untuk Linux di bawah lisensi non-komersial secara gratis (saya pikir saya membacanya gratis di suatu tempat di halaman mereka: Intel - Pengembangan Perangkat Lunak Non-Komersial ). Ada juga lisensi non-komersial gratis untuk siswa, tetapi lisensi ini tidak berlaku meskipun alat ditawarkan untuk ketiga sistem operasi utama (tautan terputus karena pembatasan reputasi).

Tujuan

Saya (sebagai non-mahasiswa) ingin dapat menggunakan kompiler Intel untuk kemungkinan peningkatan kecepatan eksekusi di bawah lisensi non-komersial untuk mengkompilasi file objek yang dapat dihubungkan untuk membuat executable dan pustaka tautan dinamis untuk Windows (dan mungkin OS X)

Keterangan lebih lanjut:

Apa yang saya simpulkan dari dokumen ini adalah bahwa kompiler Intel membuat file objek yang kompatibel dengan kompiler dominan platform.

Sub-pertanyaan:

  1. Apa format file objek dari gcc, g ++, cl, mingw32, icc, icpc, dan icl pada Windows dan Linux (versi saat ini)?
  2. Dapatkah bagian dari toolchain cross-compiler mingw32 digunakan untuk mencapai tujuan?
  3. Apakah saya benar bahwa metadata dalam file objek yang dihasilkan adalah masalah utama?

iklan 2:
mingw32-objcopy tampaknya dapat mengubah output kompiler Intel di Linux (mungkin ELF) ke COFF yang kompatibel dengan Microsoft (dengan kemungkinan pengecualian untuk file objek yang dapat dipindahkan). Bisakah seseorang mengonfirmasi bahwa ini benar-benar berfungsi (untuk aplikasi non-sepele), tolong?

Hugo
sumber
1
+1. Pertanyaan menarik.
Neil
Apakah Anda sudah melihat Wine? AFAIK, Wine menyediakan toolchain yang dapat membangun executable Windows di Linux; sangat mungkin Anda bisa menghubungkan ICC dengan itu. Anda mungkin juga memiliki beberapa kesuksesan menjalankan icc Windows di dalam Wine dan menghubungkannya dengan toolchain cross-kompilasi ming32. Saya belum mencobanya, tetapi dengan cukup mengotak-atik, saya pikir itu harus mungkin.
tdammers
@tdammers Menurut WineHQ toolchain untuk membangun executable Windows di Linux adalah MingW32, jika saya tidak salah.
Hugo
Dari forum Intel jawabannya tampaknya "tidak": software.intel.com/en-us/forums/topic/282588
Vitor Py
@VitorBraga saya menafsirkan pertanyaan seperti ini: "Apakah Intel Compiler dapat langsung melakukan kompilasi silang?" Jawabannya adalah "Tidak" (tidak ada opsi dan pustaka yang diperlukan, sejauh yang saya tahu), tapi ... arsitektur komputer (IA32, AMD64) akan sama dalam kasus saya dan jika saya hanya menggunakan pustaka Windows untuk mengkompilasi program di Linux saya akan mengharapkan untuk mendapatkan kode yang dapat dieksekusi yang dapat dieksekusi di Windows - jika dihubungkan dengan perpustakaan Windows untuk membuat Windows yang dapat dieksekusi.
Hugo

Jawaban:

1

Dimungkinkan untuk membuat executable Windows pada mesin Linux build dengan menggunakan cross-compiler. Namun, Intel tidak menyediakan kompiler silang semacam itu.

Untuk menjawab sub-pertanyaan:

Apa format file objek dari gcc, g ++, cl, mingw32, icc, icpc, dan icl pada Windows dan Linux (versi saat ini)?

Format untuk file objek ditentukan secara efektif oleh sistem operasi (atau lebih tepatnya, kompiler yang digunakan untuk membangunnya). Untuk Windows, ini adalah format Portable Executable (PE) dan untuk Linux format ELF .

Dapatkah bagian dari toolchain cross-compiler mingw32 digunakan untuk mencapai tujuan?

Tidak. Bagian yang relevan adalah pembuat kode, yang merupakan bagian yang bertanggung jawab untuk menghasilkan format objek yang tepat dan bagian pada kompiler Intel yang memberikan kecepatan yang dihasilkan kode kepada mereka.

Apakah saya benar bahwa metadata dalam file objek yang dihasilkan adalah masalah utama?

Tidak. Ini satu masalah, tetapi ada lebih banyak. Masalah yang lebih mendasar adalah perbedaan potensial dalam cara parameter dilewatkan ke kernel dan / atau pustaka standar. IIRC, konvensi tersebut berbeda antara Windows dan Linux.

Bart van Ingen Schenau
sumber
0

Jawabannya hampir pasti ya. Saya tahu bahwa kompilasi kompilasi binari Windows (melalui mingw32 ) pada kotak Linux dengan mudah dimungkinkan menggunakan gcc - jelas Anda tidak akan dapat menjalankan program di Linux (kecuali jika berfungsi di bawah Wine), tetapi saya tahu beberapa program yang mendapatkan Binari Windows dengan cara ini.

Namun, saya tidak tahu apakah kompiler Intel memiliki opsi untuk ini, saya harus berpikir itu.

Format objek untuk Windows adalah PE , sedangkan untuk Linux ELF -nya .

gbjbaanb
sumber
Menurut msdn : "Para kompiler menghasilkan file Common Object File Format (COFF) .obj)." <br/>
Hugo
Oke, itu tidak berhasil. Menurut Wikipedia, PE berasal dari COFF dan kedua format file dapat digunakan sebagai format file objek dan format file yang dapat dieksekusi.
Hugo
0

Dengan kode C yang terhubung dengan apa pun (langsung) yang menggunakan konvensi panggilan khusus Microsoft, Anda mungkin berkesempatan menggunakan MinGW objcopy. Saya telah menggunakannya untuk mengonversi file objek yang dirakit, tetapi kemudian saya tidak perlu khawatir tentang konvensi pemanggilan.

Saya hanya akan menghabiskan waktu Anda mencoba melakukan ini alih-alih mendapatkan GCC atau bergantung untuk melakukan apa yang Anda inginkan. Jika kecepatan seperti itu benar-benar penting, kompilasi biner Linux dengan kompiler Intel dan coba lihat apa, jika ada, itu mempercepat kode Anda. Anda dapat menambal perakitan jika semuanya gagal.

Ericson2314
sumber
0

Saya mengusulkan jawaban berikut:

Yang pasti mungkin (condong ke arah ya) dengan tetapi mengenai konteksnya.

Penjelasan: Mengenai bagian "condong": Tampaknya tidak membuang-buang waktu untuk mencoba ini, tetapi (bagian "memasukkan") dengan mempertimbangkan jawaban ini Anda kemungkinan tidak akan mendapatkan peningkatan waktu pelaksanaan dibandingkan dengan Intel -hanya toolchain. Bagian yang relevan adalah penghubung dan umpan balik runtime ke kompiler (optimasi seluruh program, optimasi dipandu profil, pembuatan kode waktu tautan).

Detail tambahan:
Menurut FAQ MinGW ada kemungkinan masalah dengan menggunakan perpustakaan dan DLL:
"Meskipun dll seharusnya cukup portabel di berbagai kompiler Windows, mengakses dll melalui file perpustakaan (.lib atau .a) tidak. Perpustakaan format file khusus untuk kompiler tertentu dan tidak dapat digunakan dengan mudah dengan kompiler yang berbeda kecuali jika kompiler menyediakan dukungan untuk itu. "

Untuk melengkapi jawabannya:
sub-pertanyaan 1:

Apa format file objek dari gcc, g ++, cl, mingw32, icc, icpc, dan icl pada Windows dan Linux (versi saat ini)?

Format file objek default untuk kompiler pada Windows adalah COFF (kemungkinan varian PE ). Format file objek default untuk kompiler di Linux adalah ELF

sub-pertanyaan 2:

Dapatkah bagian dari toolchain cross-compiler mingw32 digunakan untuk mencapai tujuan?

Kemungkinan besar ya (untuk bagian yang menghubungkan), tetapi kemungkinan besar Anda tidak akan mendapatkan banyak peningkatan waktu eksekusi.

sub-pertanyaan 3:

Apakah saya benar bahwa metadata dalam file objek yang dihasilkan adalah masalah utama?

Mengenai tautan: ya.

Hugo
sumber