2010-11-08 3 views
7

C 컴파일에 대한 기본적인 지식이 있지만 몇 가지 일반적인 크로스 컴파일 질문에 대한 답을 얻을 필요가 있습니다. 제 경우에는 ARM 단일 보드 컴퓨터에서 실행될 Fedora Linux 상자에서 프로그램을 크로스 컴파일하려고합니다.C에 대한 교차 컴파일 요구 사항

  1. 첫 번째 질문은 헤더에 관한 것입니다. ARM 리눅스 도구 패키지를 다운로드했으며 include 디렉토리에 stdio.h와 같은 헤더 파일이 들어 있습니다. 내가 크로스 컴파일 할 때 필자는이 "target"include 디렉토리를 내 시스템 include 디렉토리와 반대로 사용해야합니까? 또는/usr/include와 같은 내 시스템의 include 디렉토리를 가리 키는 것이 좋습니까? (이 헤더 파일은 필자와 다를 경우 다를 수 있습니다.)

  2. 헤더 파일이 없으면 어떻게됩니까? 제 경우에는 ARM 보드에서 cURL 라이브러리를 활용할 계획입니다. 대상 아키텍처에 대해 걱정하지 않고 다운로드 한 컬 소스 패키지에있는 포함 디렉토리를 가리킬 수 있습니까? 그렇다면 내 첫 번째 질문과 관련이 없음을 의미합니까?

  3. 라이브러리에 정적으로 링크하고 싶습니다. 이 정적 라이브러리가 대상 ARM 플랫폼에 대해 컴파일되기 전에이 작업이 수행되어야합니까? 또는 내 시스템에 직접 설치된 정적 라이브러리를 사용할 수 있습니까 (크로스 컴파일 프로세스가 비즈니스를 처리하기를 바랍니다).

  4. 라이브러리에 동적으로 링크하기로 결정한 경우 타겟 시스템에 ARM 용으로 컴파일 된이 라이브러리가 있고 ARM 보드의 LD_LIBRARY_PATH 디렉토리 중 하나에 설치해야합니다. 맞습니까?

도움 주셔서 감사합니다.

답변

10
  1. 항상 대상 헤더를 사용하십시오. 호스트 헤더와 다를 수 있습니다. 컴파일러는 이미 libc와 같은 표준 문제에 대한 기본 포함 경로의 일부로 해당 파일을 가지고 있어야합니다.
  2. 크로스 컴파일러를 사용하여 가짜 "대상"시스템 디렉토리에 cURL을 빌드하고이 대상 디렉토리에 cURL로 애플리케이션을 빌드해야합니다. cURL 라이브러리가 필요하므로 반드시 크로스 컴파일러를 사용해야합니다. 크로스 컴파일하지 않는 컴파일 (프로그램 작성 및 컴파일의 일부로 실행)과 같은 경우 빌드 프로세스를 수정해야합니다. 때때로 fakeroot은 더러운 빌드 시스템에 도움이 될 수 있습니다.
  3. 시스템의 다른 아키텍처에 대해 정적 라이브러리를 임의로 사용할 수 없습니다. 크로스 컴파일러에 의해 빌드되어야합니다.
  4. 올바르지 않습니다. 일반적으로 도서관이 있어야합니다.
+1

포인트 1로 확장하려면 : 크로스 컴파일러 환경은 벌써'#include '이 ARM 버전의 헤더를 참조하도록 설정되어 있어야합니다 (즉,/usr/포함'). – caf

+0

두 번째 항목에 대해 자세히 설명해 주시겠습니까? 나는 특히 "cURL 라이브러리가 필요하므로 크로스 컴파일러를 사용해야합니다."라고 혼란 스럽습니다. 문장. 첫 번째 문장에서이 단계를 이미 다루지 않았습니까? – Burak

+0

@Burak : ARM 크로스 컴파일러가 cURL과 함께 제공되는 것은 거의 없습니다. 그렇지 않으면 컴파일과 링키지가 작동하도록 미니 "루트 파일 시스템"을 만들어야합니다.buildroot와 OpenEmbedded 같은 프레임 워크가 존재합니다 - 교차 컴파일은 고통이 될 수 있습니다 –

3

libc를 포함하여 사용하려는 모든 라이브러리는 대상 플랫폼에 연결해야 연결될 수 있습니다. 호스트 헤더 대신 대상 헤더를 사용하여 올바른 API를 사용할 수 있습니다.