"./configure"옵션 "--build", "--host"및 "--target"의 차이점은 무엇입니까?


121

이 스크립트는 ./configure3 가지 옵션을 받아 --build, --host하고 --target. 나는 그들의 역할을 헷갈 리고있다. 그것들의 차이점과 의미는 무엇입니까?


autotools를도 사용, 크로스 컴파일에 대한 잘못된 툴체인을 사용 --host하고 --build. 나는 두 개의 C ++ 프로젝트를 가지고 있는데 Autotools가 너무 이상해서 안드로이드 용으로 빌드하는 것은 불가능합니다. 호스트의 도구 모음을 사용하여 테스트를 실행해야합니다.
jww

답변:


109

에서 언급 한 바와 같이 이 블로그 게시물 과에 언급 GCC 구성 이용 약관 , --target당신이 툴체인을 컴파일하는 경우에만 적용됩니다. 라이브러리 또는 바이너리의 일반적인 교차 컴파일을 수행 할 때

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

그러나 당신 툴체인 구축 상황이 더 복잡해질 수 있습니다. 다음이 정확하다고 생각합니다 (교차 디버거를 수동으로 컴파일했다고 말할 수는 없지만).

다음이 있다고 가정 해 보겠습니다.

  • 모든 컴파일을 수행 할 powerpc 빌드 머신
  • 코드가 실행될 mips 프로세서가있는 여러 임베디드 장치
  • 현장에서 이러한 장치를 디버깅하는 데 사용할 x86 노트북

임베디드 장치에서 실행할 디버깅 서버 (예 : gdbserver)를 구성하고 빌드합니다.

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

임베디드 장치에 연결하고 "gdbserver : 1234 a.out"을 실행하여 디버깅을 시작하고 포트 1234에서 수신 할 수 있도록합니다.

그런 다음 디버깅 클라이언트 (gdbserver에 연결하고 제어)를 다음과 같이 빌드합니다.

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

a.out 프로그램을 디버그하기 위해 현장에서 "gdbclient embedded.device : 1234"를 실행할 수 있도록 x86 랩탑에 복사합니다.

이 모든 것은 위의 GCC 링크 나 캐나다 크로스 컴파일에 대한이 섹션을보고 싶은 컴파일러에도 적용됩니다 .

또한 이 Autoconf 매뉴얼 페이지에 따르면 "target은 host, host to build, build to the result of config.guess" 에 따라 지정된 빌드, 호스트 또는 대상이 표시되지 않을 수도 있습니다 .

한마디로의 코드를 구축 --build, 그것을 실행 --host--target아키텍처 환경을 제공합니다.


11
"host"와 "target"에 무엇을 넣어야하는지 알아내는 방법은 무엇입니까?
Black

4
"--target"은 컴파일러에만 해당되므로 새 컴파일러를 빌드하는 것에 대해 이야기하고있는 것 같습니다. * "host"는 새 컴파일러가 실행되어야하는 곳입니다. * "target"은 새 컴파일러에 의해 생성 된 실행 파일이 실행되어야하는 곳입니다.
user1735594

--host = i686이 여기서 유효하지 않기 때문에 이것이 잘못된 대답으로 만들지 않습니까?
infoclogged

1
제공된 답변은 컴파일이 MIPS 대상에 대해 수행되었으며 이것이 빌드이고 호스트가 MIPS 시스템의 디버거임을 언급합니다. 이것은 디버거 / 컴파일러도 powerpc에 의해 구축되었음을 의미합니까? 이것은 다른 사용자 (Ned)로부터받은 주석입니다. build = 컴파일러를 컴파일하는 위치, host = 컴파일러가 실행되는 위치, target = 컴파일러가 생성하는 코드. 참조 : stackoverflow.com/questions/7088576/…
supmethods

Ned에 따르면 이것은 powerpc가 빌드 / 호스트이고 x86 머신이 디버거의 타겟이고 타겟이 MIPS 시스템임을 의미하지 않을까요? "빌딩"과 "빌딩"이 무엇인지 자세히 설명해 주시겠습니까? gcc.gnu.org/onlinedocs/gccint/Configure-Terms.html을 참조합니다 .
2018 년

75

참고 : 인수 --target는 컴파일러 (예 : GCC)를 빌드 할 때만 의미가 있습니다. configureGCC를 빌드하기 전에 실행할 때 :

  • --build: 당신이 만들고있는 기계
  • --host: 당신이 만드는 기계
  • --target: GCC가 바이너리를 생성 할 머신

로부터 GCC 문서 ( 호스트 / 대상 특정 설치 정보 ) :

빌드, 호스트 및 대상이 모두 동일한 경우이를 네이티브라고합니다. 빌드와 호스트가 동일하지만 대상이 다른 경우이를 교차라고합니다. 빌드, 호스트 및 대상이 모두 다른 경우이를 캐나다인이라고합니다 (캐나다의 정당과 당시 빌드 작업을하는 사람의 배경을 다루는 모호한 이유 때문에). 호스트와 대상이 동일하지만 빌드가 다른 경우 크로스 컴파일러를 사용하여 다른 시스템에 대한 네이티브를 빌드하는 것입니다. 어떤 사람들은 이것을 호스트 x 호스트, 교차 네이티브 또는 교차 빌드 네이티브라고 부릅니다. 빌드와 대상이 동일하지만 호스트가 다른 경우 크로스 컴파일러를 사용하여 빌드중인 머신의 코드를 생성하는 크로스 컴파일러를 빌드하는 것입니다. 이것은 드문 경우이므로 일반적인 설명 방법이 없습니다. 이것을 크로스 백이라고 부르는 제안이 있습니다.


2
그것은 분명히 --target컴파일러가 아닌 프로젝트와 관련이 없다는 것을 의미 합니다. 그렇다면 표준 구성 옵션 인 이유는 무엇입니까? 혼란 스럽습니다.
dhardy

1
@dhardy : configure훌륭하고 깨끗한 디자인의 정점은 아닙니다. 나는 응용 프로그램 특정 기능 크리프의 결과라고 생각합니다.
Tim Čas 2015

예를 들어 "./configure --build = powerpc --host = i686 --target = mips"를 실행하여 gcc를 얻으려면 출력 실행 파일이 손상됩니까? 일반적으로 gcc는 c 코드를 빌드 한 다음 여러 플랫폼에 대해 다양한 결과를 출력 할 수있는 강력한 도구입니다. 여기서 '--target = mips'를 사용하면 지정된 gcc가 기능을 잃습니까?
gfan aug

또한 작동 할 수있는 것은 config.guess 및 config.sub 파일을 업데이트하는 것이므로 컴파일러는 더 많은 대상 플랫폼을 알고 있습니다. 여기에서 얻을 수 있습니다. gnu.org/software/gettext/manual/html_node/config_002eguess.html
wirtsi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.