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:
- Apa format file objek dari gcc, g ++, cl, mingw32, icc, icpc, dan icl pada Windows dan Linux (versi saat ini)?
- Dapatkah bagian dari toolchain cross-compiler mingw32 digunakan untuk mencapai tujuan?
- 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?
Jawaban:
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:
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 .
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.
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.
sumber
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 .
sumber
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.
sumber
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:
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:
Kemungkinan besar ya (untuk bagian yang menghubungkan), tetapi kemungkinan besar Anda tidak akan mendapatkan banyak peningkatan waktu eksekusi.
sub-pertanyaan 3:
Mengenai tautan: ya.
sumber