2015-08-20 11 views
8

çalışmıyor, ama sadece bu kontrol etmek isteriz. o kaynak kodu uyumlu beri böyle hiçbir işletim sistemine özgü kütüphaneler ya da bir şey olduğu gibiNeden linux derlenmiş bir program nedeniyle derlenmiş program linux çalıştırılabilir olarak derlenmiş gerçeğine benim sorunum neredeyse eminim, Windows

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    printf("Hello world!\n"); 
    return EXIT_SUCCESS; 
} 

yukarıdaki "programı", Windows ve Linux sadece iyi üzerinde derlemek gerekir. Oysa

, benim Linux kutuyu "c99 merhaba.c -o Hello.exe" yazın ve sonra bir windows makinesine "çalıştırılabilir", yayınlanmaya reddediyor aktarın. Anladığım kadarıyla Linux sadece linux üzerinde çalışan bir yürütülebilir dosya oluşturur, böylece ".exe" eklenmesi hiç bir etkisi yoktur. Windows için Linux'ta bu programı kurmak için, bu programı bir Windows makinesinde yeniden derlemem gerekecek mi? Veya çalışacak başka basit bir yöntem var mı? Windows'ta

, bu Portable Executable format geçerli:

+8

(Temelde) doğru anlıyorsunuz. Farklı işletim sistemlerinde çalıştırılabilir farklı formatlar (ve farklı uygulama modelleri) vardır. –

+2

Diğer yöntem "çapraz derleme" olarak adlandırılmıştır. –

+0

Linux, ikili dosyaları için ELF kullanır. – Alexguitar

cevap

19

Windows ve Linux çalıştırılabilir dosyaları iki farklı uyumsuz biçimleri kullanırlar.

Linux'ta bu ELF (Executable and Linkable Format) olduğunu. Her bir biçim, üzerinde çalışacakları işletim sisteminin özelliklerinden yararlanır, böylece normalde başka bir platformda çalıştırılamazlar.

Ayrıca, bir çalıştırılabilir sadece belleğe yüklendikten sonra yürütülür küçük bir kod bölümünü içerir. Bir yürütülebilir dosya, programın sistemle etkileşime girmesini sağlayan işlevselliğin çoğunu sağlayan sistem kitaplıklarına bağlanır.
Sistemler birbirinden çok farklı olduğu için, kütüphaneler değişiklik gösterir ve Linux için bir program, aynı kitaplığa bağlı olmadıkları için, ELF'yi kullananlara rağmen FreeBSD'de çalıştırılamaz.

Linux üzerinde Windows yürütülebilir derlemek için çapraz derleme olarak bilinen bir teknik kullanılabilir. Bir derleyici, her şeyden önce, bir ikili dosyaya yazılan bir programdır, böylece herhangi bir derleyici, teorik olarak, hedef sistemin kütüphanelerinin bağlanabileceği sürece, herhangi bir platform için kod yazabilir.

MinGW-w64 proje bu sağlayan bir toolchain sağlar. Örneğin, sudo apt-get install mingw-w64 komutunu kullanarak debian tabanlı sistemlere kurabilirsiniz.

yüklü yürütülebilir

bu gibi kullanılabilir:

i686-w64-mingw32-gcc hello.c -o hello32.exe  # 32-bit 
x86_64-w64-mingw32-gcc hello.c -o hello64.exe # 64-bit 
+0

Bunun önemli olmadığını unutmayın: Örneğin, OpenBSD ve Linux, ikili dosyaları için ELF kullanır, ancak OpenBSD'de Linux ikili dosyalarını çalıştıramazsınız. Öte yandan, Linux'ta Windows ikili dosyalarını Wine yardımıyla çalıştırabilirsiniz. – fuz

+0

@FUZxxl iyi puanlar. Linux çiftlerinin orada çalışmasına izin veren OpenBSD için bir compat_linux emülasyon katmanı olduğuna inanıyorum. – SirDarius

+2

İpucu yapmaya çalıştığım şey, ikili formatın bu soruya göre kırmızı bir ringa balığı olması. Asıl cevap, ikili sistemin etkileşime girdiği işletim sisteminin aynı olmadığı ve bir çeşit sistem çağrısı çeviri katmanı olmadığı sürece, binary'nin çalıştırılamamasıdır. – fuz

0

Onun bir derleme durum diferently java dan .exe ayrılmakta OS kodu yorumlamak için herhangi bir sanal makine yok. Daha sonra, o iş için yürüttüğü işi yürütmek için tüm özel .dll ve lib'lerinin işletim sistemine sahip olması gerekir.

.exe'de her şey belirli bir işletim sisteminde çalıştırılmak üzere hazırlanmıştır, Java'da başka bir şekilde sanal makine, kodunuzu farklı işletim sistemi işletim sistemlerinde yorumlayan ve çalıştıran sihirdir.

İlgili konular