콘텐츠로 건너뛰기
STAGING SERVER
DEVELOPMENT SERVER

크로스 개발#

이 토픽에서는 크로스 개발을 위한 Debian Multiarch 기능에 대해 설명합니다.

Debian Multiarch#

Debian 프로젝트는 AMD64 및 ARM64를 비롯한 여러 컴퓨터 아키텍처용 패키지 리포지토리를 유지 관리합니다. 이는 AMD64 개발 호스트에서 Smart blaze와 같은 ARM64 장치를 타겟으로 하는 크로스 개발에 관련이 있습니다. Debian에서는 두 아키텍처용 패키지가 동일한 리포지토리 URL에서 제공되므로 빌드 종속성으로 서로 다른 아키텍처용 패키지를 편리하게 설치할 수 있습니다.

정보

Ubuntu의 경우 ARM64 리포지토리는 별도의 ubuntu-ports 리포지토리에 있습니다.

Multiarch 기능을 사용하면 크로스 툴체인과 함께 사용할 다른 아키텍처용 패키지를 설치할 수 있습니다. 라이브러리 패키지의 -dev 변형은 해당 패키지를 기반으로 빌드하는 데 필요한 헤더와 라이브러리를 제공하므로 일반적으로 가장 중요합니다. 디버깅을 위해 디버그 심볼(-dbg 또는 -dbgsym) 및 해당 소스 패키지를 별도로 설치할 수도 있습니다.

크로스 개발 툴체인은 crossbuild-essential-arm64 패키지로 제공됩니다.

Native Development#

애플리케이션 개발을 위해서는 타겟 VM(또는 다른 ARM64 장비)에서 애플리케이션을 기본적으로 먼저 빌드 및 테스트한 다음, AMD64 개발 호스트에서 크로스 컴파일하는 것이 가장 편리합니다.

Cross-Building Using Docker Container#

위의 Multiarch 개념은 Smart blaze SDK에 포함된 크로스 빌드용 Docker 컨테이너에서 시연됩니다. 이 컨테이너에는 크로스 개발 툴체인, pylon SDK용 개발 파일, 그리고 pylon Supplementary Package for blaze가 포함되어 있습니다. 컨테이너는 ARM64 실행 파일을 크로스 빌드하기 위한 CMake 툴체인 파일로 사전 설정되어 있습니다. 컨테이너 설정에 대해서는 Docker Container for Development를 참조하십시오.

자체 소프트웨어를 빌드하려면 Dockerfile을 확장하여 필수 <packagename>-dev:arm64 종속성을 설치하십시오. 대부분의 경우 이러한 종속성은 CMake의 해당 find_package 호출을 사용하여 통합할 수 있습니다. 예를 들어 Docker 컨테이너에는 libopencv-dev 패키지가 포함되어 있습니다. blaze 샘플 CMakeLists.txt 파일에서 다음 호출을 확인할 수 있습니다.

find_package(OpenCV)

다음을 사용하십시오. ${OpenCV_INCLUDE_DIRS} 변수 및 target_include_directories() 그리고 다음을 설정하십시오: ${OpenCV_LIBS} 변수 및 target_link_libraries(). Boost와 같은 일부 패키지는 CMake 타겟도 내보냅니다. 이 경우 target_link_libraries()에서 해당 타겟에 링크하는 것만으로도 충분하며, 인클루드 경로도 자동으로 구성됩니다.

종속성을 Debian 패키지로 사용할 수 없지만 CMake를 지원하는 경우 FetchContent 모듈을 사용하여 소스에서 빌드하십시오. 이 경우 프로젝트 문서에 설명된 대로 Docker 컨테이너에 필요한 빌드 종속성을 설치하십시오. 라이브러리가 CMake를 지원하지 않는 경우 보다 일반적인 ExternalProject 모듈을 사용할 수 있습니다.

Docker Container for Development#

카메라용 소프트웨어를 개발하려면 크로스 개발 툴체인과 모든 필수 패키지가 포함된 Docker 컨테이너를 설정할 수 있습니다.

Docker 엔진을 설치하려면 docs.docker.com의 지침을 따르십시오.

Smart blaze 개발 컨테이너 빌드하기#

pylon Supplementary Package for blaze에는 크로스 개발 컨테이너 설정을 위한 Dockerfile이 포함되어 있습니다. 일반적인 Linux 시스템의 경우, 이 파일의 경로는 /opt/pylon/share/pylon/Samples/blaze/smartblaze/vm/container/Dockerfile입니다. 컨테이너를 빌드하려면 Dockerfile이 포함된 디렉토리로 이동하여 터미널에서 다음 명령을 실행합니다.

docker build -t blaze-dev --build-arg UID=$(id -u) --build-arg GID=$(id -g) .

이렇게 하면 크로스 툴체인, blaze용 pylon SDK, 그리고 크로스 컴파일에 적합한 CMake 설정이 포함된 Debian 컨테이너가 생성됩니다.

Docker 컨테이너에서 명령어 실행하기#

개발 컨테이너 내부에서 명령어를 실행하려면 다음 별칭(alias)을 생성합니다.

alias dockerDo='docker run --rm -ti --volume $(pwd):/work --workdir /work blaze-dev'

편의를 위해 이 줄을 ~/.bashrc 파일에 추가할 수 있습니다.

이 dockerDo alias는 현재 작업 디렉토리를 임시 컨테이너에 마운트하고 다음에 지정된 명령어를 실행합니다. dockerDo 컨테이너 내부에서 실행됩니다. 마운트된 디렉토리는 명령어의 작업 디렉토리로 사용됩니다. 명령어는 컨테이너를 빌드한 사용자(현재 사용자여야 함)의 사용자 ID와 일치하는 사용자로 컨테이너 내에서 실행됩니다. 이를 통해 컨테이너 내에서 생성된 파일과의 권한 문제를 방지할 수 있습니다.

예:

dockerDo cmake -B build .
dockerDo cmake --build build -j$(nproc)

정보

컨테이너에는 이미 환경 변수가 정의되어 있습니다. CMAKE_TOOLCHAIN_FILE, 이는 개발 컨테이너에 포함된 ARM64 크로스 컴파일러 툴체인을 사용하도록 CMake에 지시합니다.

ELBE SDK(Embedded Linux Build Environment)를 사용한 크로스 빌드#

rootfs 및 크로스 빌드 환경을 위한 Docker 컨테이너와 중복된 패키지 데이터를 피하기 위해, rootfs와 동일한 소스인 elbe/blazevm.xml에서 Yocto 스타일 SDK를 생성할 수 있습니다. 자세한 내용은 Building an SDK with ELBE를 참조하세요.

CMake 프로젝트의 경우, 아래의 blaze 샘플 프로젝트에 표시된 대로 ELBE SDK를 사용하세요. 설치 환경에 맞게 CMake 툴체인 파일 경로를 조정하세요. 일반적인 Linux 시스템의 경우, 이 경로는 /opt/pylon/share/pylon/Samples/blaze/smartblaze/vm/elbe/cross-toolchain.cmake입니다.

cd /opt/pylon/share/pylon/Samples/blaze/cpp/FirstSample/
. /opt/elbe-sdk-aarch64-linux-gnu-BlazeVM-1.2/environment-setup-elbe-aarch64-linux-gnu-BlazeVM-1.2
export CMAKE_TOOLCHAIN_FILE=/opt/pylon/share/pylon/Samples/blaze/smartblaze/vm/elbe/cross-toolchain.cmake
cmake -B build .
cmake --build build -j$(nproc)

카메라에서 VM 관리하기#

VM의 인터넷 액세스를 설정한 후, apt-get 또는 pip install을(를) 사용하여 패키지를 설치할 수 있습니다. 또는 elbe/blazevm.xml 설정 파일을 확장하여 처음부터 새로운 root 파일 시스템을 빌드할 수 있습니다.

타겟 VM의 런타임 라이브러리

Docker 컨테이너나 ELBE SDK로 소프트웨어를 빌드하고 VM에 설치할 때는 모든 런타임 종속성이 존재하는지 확인하세요. 크로스 빌드 환경에 설치한 모든 <packagename>-dev:arm64 패키지에 대해, 타겟 root 파일 시스템에 해당하는 라이브러리 패키지를 설치하세요. OpenCV의 경우, 필요한 패키지들이 여러 모듈로 나뉘어 있습니다. blaze 샘플의 경우 다음이 필요합니다. libopencv-calib3d, libopencv-core, libopencv-highgui, libopencv-imgcodecs및 libopencv-imgproc.