2011-04-29 3 views
2

오픈 소스 C++ 라이브러리 DCMTK http://dicom.offis.de/dcmtk.php.en을 사용하고 있습니다. VC++ IDE, MacOS Xcode, Mac iOS 시뮬레이터를 사용하여 Windows에서이 라이브러리를 성공적으로 컴파일했습니다. 그러나 ARM 기반 아키텍처이기 때문에 iOS 장치에서이 라이브러리를 컴파일 할 수 없습니다. DCMTK 라이브러리는 Intel 아키텍처에서 매우 잘 컴파일됩니다.인텔에서 암으로 라이브러리 크로스 컴파일

이제 내 문제 문은 다음과 같습니다 - 나는 크로스 컴파일하여 ARM 아키텍처에이 DCMTK C++ 라이브러리를 컴파일 할 필요가

. 크로스 컴파일을 위해 우분투 64 비트 머신을 사용하고 있습니다. GNU ARM 툴 체인에서 바이너리를 설치했습니다. http://www.gnuarm.com/ GCC 툴 체인 4.0 binutils-2.16.1, gcc-4.0.2-c-C++, newlib-1.14.0, insight-6.4, TAR BZ2 [65.5MB ] 바이너리 ARM 크로스 컴파일을위한 우분투 64 비트 머신 용.

우분투에서 이러한 바이너리를 설치 한 후 내가 쉘

CC에서 다음 명령을 실행 한 DCMTK C++ 라이브러리를 구성하는 PATH = $ PATH에/gnu_arm/빈

에 PATH 환경 변수를 설정 = arm-elf-gcc CXX = arm-elf-g ++ AR = arm-elf-ar RANLIB = arm-elf-ranlib ARFLAGS = cruv ./configure -prefix = $ home_dicom -target = arm-elf -host = arm-elf - enable-std-includes -disable-threads

make 파일을 올바르게 작성합니다. 이제 make 명령어를 사용하여 코드를 컴파일하려하지만 다음과 같이 많은 컴파일 오류가 발생합니다. - 1) forstd 인 첫 번째 종속 C++ 라이브러리를 컴파일하려고했습니다. DIR *, struct dirent, opendir(), closedir() 호출에 대해 오류가 발생했습니다. 이 호출에는이 호출이 포함되지만 위의 호출에 대한 정의가이 헤더 파일에서 발견되지 않았습니다.

2)이 오류와 같은 다음과 같은 오류가있어 oflog 나는 다른 라이브러리를 컴파일 할 때 : ntohl이 범위에서 선언되지 않았습니다 오류 : htons이 범위에서 선언되지 않았습니다 오류 nthos가이 범위 오류가 선언되지 않았습니다 : htonl은이 범위에서 선언되지 않았습니다. 이 호출은 네트워킹 호출이며 GNU ARM 도구의 헤더 파일에 정의되어 있지 않습니다.

ARM 바이너리 소스를 다운로드하고 tar 파일을 추출하고 누락 된 헤더 파일을 우분투에 설치된 GNU ARM에 복사하려고했습니다. 일부 파일의 경우 복사 된 헤더 파일을 변경 한 후 컴파일되고 일부는 다시 컴파일 오류가 발생합니다. 일부 표준 헤더 파일이 없기 때문에 DCMTK 라이브러리에있는 모든 파일에 대한 컴파일 오류 루프가 있습니다.

우분투 64 비트 시스템에서 ARM 크로스 컴파일에 사용할 수있는 다른 도구 체인이 있는지 제안하십시오. 또는 다른 좋은 해결책이 있습니다.

감사합니다 !!! Amit

답변

0

크로스 컴파일 할 때 많은 문제가 있습니다. 크로스 컴파일을위한 세 가지 주요 플래그가 있습니다. -host, -target 및 -build. -host 플래시는 결과 바이너리가 실행될 시스템입니다. -build flash는 컴파일 할 시스템입니다. -target 플래그는 크로스 컴파일에 사용될 라이브러리를 빌드하는 데 사용됩니다. 그래서 자신 만의 gcc 툴 체인을 만들면됩니다. 따라서 우리는 툴 체인을 구축하지 않으므로 타겟 플래그를 설정하지 않을 것입니다. -host 플래그는 arm-elf입니다.그리고 -build 플래그는 amd64가됩니다.

+1

AFAIK 잘못되었습니다. --host는 아키텍처 프로그램이 실행될 것을 정의합니다. --target은 개발 도구와 함께 사용됩니다. 예를 들어 아키텍처 X (--host)에서 실행될 gdb를 빌드하고 아키텍처 Y (--target)로 작성된 디버그 프로그램을 빌드 할 수 있습니다. --build는 빌드 머신을 정의합니다. – dbrank0

+0

아. 나는 네가 옳다고 생각한다. 다른 사람들을 혼동하지 않도록 내 게시물을 업데이트 할 것입니다. – richmb

0

보통 일반 c 컴파일러와 교차 컴파일러간에 불일치가 있으면 크로스 컴파일이 실패합니다. buildroot에 의해 생성 된 toolchain으로 avr32를위한 여러 라이브러리를 컴파일했지만 어떤 경우에는 (예를 들어 socat 프로젝트) 가능하지 않습니다.

호스트, 대상 및 CXX 플래그가 괜찮아 보입니다. AR 플래그를 넣을 필요가 없다고 생각합니다 (호스트와 타겟 옵션을 가진 아이디어입니다).

./configure --host=avr32-linux --prefix=/home/juan/builds/build_expat/ CC=avr32-linux-gcc 
make; make install 

내가 IA32 아키텍처에서 크로스 컴파일을 시도 당신을 추천 할 수 있습니다 : 반면에

이는 AVR32에 대한 해외 거주자 라이브러리에 대한 예입니다. 나는 우분투에 몇 가지 문제가 과거에있었습니다.

관련 문제