Sự khác biệt của tùy chọn “./configure” “--build”, “--host” và “--target” là gì?


121

Các kịch bản ./configurechấp nhận 3 lựa chọn --build, --host--target. Tôi đang nhầm lẫn vai trò của họ. Sự khác biệt và ngữ nghĩa của chúng là gì?


Autotools sẽ sử dụng chuỗi công cụ sai để biên dịch chéo, thậm chí sử dụng --host--build. Tôi có hai dự án C ++ và không thể xây dựng cho Android vì Autotools quá khó. Nó yêu cầu chạy thử nghiệm bằng chuỗi công cụ của máy chủ.
jww

Câu trả lời:


109

Như đã lưu ý trong bài đăng blog này và được đề cập đến trong Điều khoản cấu hình GCC , --targetchỉ áp dụng khi bạn đang biên dịch các công cụ. Khi bạn đang thực hiện biên dịch chéo bình thường của một thư viện hoặc tệp nhị phân mà bạn sử dụng

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

Tuy nhiên, khi bạn đang xây dựng các toolchains, mọi thứ có thể trở nên phức tạp hơn. Tôi nghĩ rằng điều sau là đúng (mặc dù tôi không thể nói rằng tôi đã từng biên dịch thủ công một trình gỡ lỗi chéo):

Hãy nói rằng bạn có:

  • một máy xây dựng powerpc mà bạn sẽ thực hiện tất cả việc biên dịch trên đó
  • một số thiết bị nhúng, với bộ xử lý mips, mã của bạn sẽ chạy trên đó
  • một máy tính xách tay x86 mà bạn sẽ sử dụng để gỡ lỗi các thiết bị này trong trường

Bạn sẽ định cấu hình và xây dựng máy chủ gỡ lỗi của mình (ví dụ: gdbserver) để chạy trên thiết bị nhúng của bạn với

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

để bạn có thể đưa vào thiết bị nhúng của mình và chạy "gdbserver: 1234 a.out" để bắt đầu gỡ lỗi và lắng nghe trên cổng 1234.

Sau đó, bạn sẽ xây dựng ứng dụng gỡ lỗi của mình (kết nối và điều khiển gdbserver) với

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

mà bạn sẽ sao chép vào máy tính xách tay x86 của mình để trong trường, bạn có thể chạy "gdbclient nhúng.device: 1234" để gỡ lỗi chương trình a.out của mình.

Tất cả điều này cũng áp dụng cho các trình biên dịch mà bạn có thể muốn xem liên kết GCC ở trên hoặc phần này về trình biên dịch chéo của Canada .

Cũng xin lưu ý rằng, trong thực tế, bạn có thể không thấy bản dựng, máy chủ lưu trữ hoặc mục tiêu được chỉ định bởi vì theo trang hướng dẫn sử dụng Autoconf này , "mục tiêu mặc định là máy chủ lưu trữ, máy chủ lưu trữ để tạo và xây dựng theo kết quả của config.guess."

Nói cách khác, hãy xây dựng mã trên --build, chạy nó --hostvới --targetmôi trường kiến ​​trúc.


11
Làm thế nào để tìm ra những gì cần đặt cho "máy chủ" và "mục tiêu"?
Đen

4
Tôi đoán bạn đang nói về việc xây dựng một trình biên dịch mới, vì "--target" chỉ phù hợp với các trình biên dịch. * "host" là nơi trình biên dịch mới của bạn sẽ chạy. * "target" là nơi các tệp thực thi được tạo bởi trình biên dịch mới của bạn sẽ chạy.
user1735594

Điều này không làm cho đây là một câu trả lời sai, bởi vì --host = i686 không hợp lệ ở đây?
infoclogged

1
Câu trả lời được cung cấp đề cập đến việc biên dịch đã được thực hiện cho mục tiêu MIPS và đây là bản dựng, và máy chủ lưu trữ là trình gỡ lỗi cho máy MIPS. Điều này có nghĩa là trình gỡ lỗi / trình biên dịch cũng được xây dựng bởi powerpc? Đây là nhận xét mà tôi nhận được từ một người dùng khác (Ned): build = tôi đang biên dịch trình biên dịch ở đâu, host = nơi trình biên dịch sẽ chạy, target = trình biên dịch sẽ tạo ra mã gì. Tham khảo: stackoverflow.com/questions/7088576/…
supmethods

Theo Ned, điều này không có nghĩa là powerpc vừa là bản dựng / máy chủ lưu trữ, máy x86 vừa là mục tiêu của trình gỡ lỗi và mục tiêu là hệ thống MIPS. Bạn có thể giải thích rõ hơn "xây dựng để" và "xây dựng trên" là gì không? Tôi tham chiếu đến gcc.gnu.org/onlineocs/gccint/Configure-Terms.html .
supmethods

75

Lưu ý: Đối số --targetchỉ có ý nghĩa khi xây dựng trình biên dịch (ví dụ: GCC). Khi chạy configuretrước khi xây dựng GCC:

  • --build: máy bạn đang xây dựng
  • --host: máy bạn đang chế tạo
  • --target: máy mà GCC sẽ tạo mã nhị phân cho

Từ tài liệu GCC ( ghi chú cài đặt Máy chủ / Mục tiêu cụ thể ):

Nếu bản dựng, máy chủ và đích đều giống nhau, thì đây được gọi là bản gốc. Nếu bản dựng và máy chủ lưu trữ giống nhau nhưng mục tiêu khác nhau, điều này được gọi là chéo. Nếu bản dựng, máy chủ và mục tiêu đều khác nhau, thì đây được gọi là người canada (vì những lý do khó hiểu liên quan đến đảng chính trị của Canada và lý lịch của người làm việc trên bản dựng tại thời điểm đó). Nếu máy chủ và máy đích giống nhau, nhưng bản dựng khác nhau, bạn đang sử dụng trình biên dịch chéo để tạo bản gốc cho một hệ thống khác. Một số người gọi đây là máy chủ lưu trữ x-máy chủ lưu trữ, bản gốc kết hợp hoặc bản địa kết hợp. Nếu bản dựng và mục tiêu giống nhau, nhưng máy chủ lưu trữ khác nhau, bạn đang sử dụng trình biên dịch chéo để tạo trình biên dịch chéo tạo ra mã cho máy bạn đang xây dựng. Điều này là hiếm, vì vậy không có cách nào để mô tả nó. Có một đề xuất để gọi đây là một sự trở lại.


2
Điều này rõ ràng có nghĩa --targetlà không liên quan đến bất kỳ dự án nào mà bản thân nó không phải là một trình biên dịch. Vậy tại sao nó là một tùy chọn cấu hình tiêu chuẩn? Gây nhầm lẫn.
dhardy

1
@dhardy: configurekhông hẳn là đỉnh cao của thiết kế đẹp và sạch; Tôi đoán đó chỉ là kết quả của sự thay đổi tính năng dành riêng cho ứng dụng.
Tim Čas

Nếu tôi muốn lấy một gcc, chẳng hạn như chạy "./configure --build = powerpc --host = i686 --target = mips", đầu ra có thể thực thi được không? thông thường, gcc là một công cụ mạnh mẽ có thể xây dựng mã c, sau đó xuất ra nhiều loại kết quả cho nhiều nền tảng. Ở đây nếu tôi sử dụng '--target = mips', gcc được chỉ định có bị mất khả năng không?
gfan

Điều cũng có thể hoạt động là cập nhật các tệp config.guess và config.sub, vì vậy trình biên dịch biết nhiều nền tảng mục tiêu hơn .. bạn có thể tải chúng tại đây: gnu.org/software/gettext/manual/html_node/config_002eguess.html
wirtsi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.