"./Configure" seçeneğinin "--build", "--host" ve "--target" arasındaki farkı nedir?


121

Komut ./configure3 seçenek kabul eder --build, --hostve --target. Rollerini karıştırıyorum. Bunların farkı ve anlam bilgisi nedir?


Autotools, çapraz derleme için --hostve hatta ve bile olsa yanlış araç zincirini kullanır --build. İki C ++ projem var ve Android için inşa etmek imkansız çünkü Autotools çok berbat. Ana bilgisayarın araç zincirini kullanarak testler yürütmekte ısrar ediyor.
jww

Yanıtlar:


109

Belirtildiği gibi bu blog yayınında ve ima GCC yapılandır Şartlar , --targetsen toolchain derleme zaman geçerlidir. Bir kitaplık veya ikili dosyanın normal çapraz derlemesini yaparken

--build=the architecture of the build machine
--host=the architecture that you want the file to run on

Eğer Ancak edilir toolchain bina, işler daha karmaşık bir hale gelebilir. Aşağıdakilerin doğru olduğunu düşünüyorum (ancak bir çapraz hata ayıklayıcıyı manuel olarak derlediğimi söyleyemem):

Şunlara sahip olduğunuzu söyleyelim:

  • tüm derlemeyi yapacağınız bir powerpc inşa makinesi
  • kodunuzun üzerinde çalışacağı, mips işlemcili birkaç gömülü aygıt
  • sahada bu cihazlarda hata ayıklamak için kullanacağınız bir x86 dizüstü bilgisayar

Hata ayıklama sunucunuzu (örn. Gdbserver), gömülü cihazınızda çalıştırmak için yapılandırır ve inşa edersiniz:

./configure --build=powerpc --host=mips

böylece gömülü aygıtınıza yapıştırabilir ve hata ayıklamayı başlatmak ve 1234 numaralı bağlantı noktasını dinlemek için "gdbserver: 1234 a.out" komutunu çalıştırabilirsiniz.

Daha sonra hata ayıklama istemcinizi (gdbserver'a bağlanır ve onu kontrol eder) ile oluşturursunuz.

./configure --build=powerpc --host=i686 --target=mips 

x86 dizüstü bilgisayarınıza kopyalayacağınız, böylece alanda a.out programınızda hata ayıklamak için "gdbclient embedded.device: 1234" çalıştırabilirsiniz.

Bunların tümü, yukarıdaki GCC bağlantısına veya Kanada çapraz derlemesi hakkındaki bu bölüme bakmak isteyebileceğiniz derleyiciler için de geçerlidir .

Ayrıca, pratikte, bu Autoconf kılavuz sayfasına göre "ana bilgisayar için hedef varsayılanlar, yapılandırılacak ana bilgisayar ve config.guess sonucuna göre inşa edileceği için" derleme, barındırma veya hedefin belirtildiğini göremeyebilirsiniz .

Kısacası, kod oluşturmak --build, bunu çalıştırmak --hostile --targetmimarlık ortamına.


11
"Ev sahibi" ve "hedef" için ne yazılacağını nasıl öğrenebilirim?
Siyah

4
"--Target" yalnızca derleyiciler için geçerli olduğundan, yeni bir derleyici oluşturmaktan bahsediyorsunuz sanırım. * "ana bilgisayar", yeni derleyicinizin çalışması gereken yerdir. * "hedef", yeni derleyiciniz tarafından üretilen çalıştırılabilir dosyaların çalıştırılması gereken yerdir.
user1735594

bu bunu yanlış bir cevap yapmaz, çünkü --host = i686 burada geçerli değil mi?
infoclog

1
Verilen yanıt, derlemenin MIPS hedefi için yapıldığından ve bu yapıdan ve ana bilgisayar MIPS makinesinin hata ayıklayıcı olduğundan bahsetmektedir. Bu, hata ayıklayıcının / derleyicinin de powerpc tarafından oluşturulduğu anlamına mı geliyor? Bu başka bir kullanıcıdan aldığım bir yorumdur (Ned): build = derleyiciyi nerede derliyorum, ana bilgisayar = derleyicinin çalışacağı yer, hedef = derleyici hangi kodu üretecek. Referans: stackoverflow.com/questions/7088576/…
supmethods

Ned'e göre bu, powerpc'nin hem yapı / ana bilgisayar, hem de hata ayıklayıcının hedefi x86 makinesi ve MIPS sistemi olarak hedef olduğu anlamına gelmez. "İnşa etmek" ve "üzerine inşa etmek" ne demek daha fazla açıklayabilir misiniz? Ben referans gcc.gnu.org/onlinedocs/gccint/Configure-Terms.html .
supmethods

75

Not: Bağımsız değişken --target, yalnızca derleyici oluştururken anlamlıdır (örn. GCC). configureGCC oluşturmadan önce çalışırken :

  • --build: üzerine inşa ettiğiniz makine
  • --host: için inşa ettiğiniz makine
  • --target: GCC'nin ikili kod üreteceği makine

Gönderen GCC belgelerinde ( Host / Hedef özel kurulum notları ):

Derleme, ana bilgisayar ve hedef hepsi aynıysa, buna yerel denir. Yapı ve ana bilgisayar aynıysa ancak hedef farklıysa buna çapraz denir. Yapı, ev sahibi ve hedef farklıysa, buna kanadalı denir (Kanada'nın siyasi partisiyle ilgili belirsiz nedenlerden ve o sırada yapı üzerinde çalışan kişinin geçmişinden dolayı). Ana bilgisayar ve hedef aynıysa ancak yapı farklıysa, farklı bir sistem için yerel oluşturmak üzere çapraz derleyici kullanıyorsunuzdur. Bazı insanlar buna host-x-host, cross native veya cross-built native diyor. Derleme ve hedef aynıysa, ancak ana bilgisayar farklıysa, üzerinde oluşturduğunuz makine için kod üreten bir çapraz derleyici oluşturmak için bir çapraz derleyici kullanıyorsunuzdur. Bu nadirdir, bu yüzden onu tanımlamanın ortak bir yolu yoktur. Bunu crossback olarak adlandırmak için bir öneri var.


2
Görünüşe göre --targetbu, kendisi bir derleyici olmayan herhangi bir proje ile ilgili olmadığı anlamına gelir . Öyleyse neden standart bir yapılandırma seçeneği? Kafa karıştırıcı.
dhardy

1
@dhardy: configuretam olarak iyi ve temiz bir tasarımın zirvesi değil; Sanırım bu sadece uygulamaya özgü özellik sürünmesinin bir sonucudur.
Tim Čas

Bir gcc almak istersem, örneğin "./configure --build = powerpc --host = i686 --target = mips" komutunu çalıştırın, çıktı yürütülebilir dosyası sakat mı? genellikle gcc, c kodu oluşturabilen ve ardından birçok platform için birçok sonuç veren güçlü bir araçtır. Burada '--target = mips' kullanırsam, belirtilen gcc yeteneği kaybeder mi?
gfan

İşe yarayabilecek şey, config.guess ve config.sub dosyalarını güncellemektir, böylece derleyici daha fazla hedef platform bilir. Bunları buradan edinebilirsiniz: gnu.org/software/gettext/manual/html_node/config_002eguess.html
wirtsi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.