交叉開發#
Debian Multiarch#
Debian 專案維護多個電腦架構(包括 AMD64 和 ARM64)的軟體包儲存庫。這些儲存庫與針對 ARM64 裝置(例如來自 AMD64 開發主機的 Smart blaze)的交叉開發息息相關。在 Debian 上,這兩種架構的軟體包都可從相同的儲存庫 URL 取得,這使得安裝不同架構的軟體包作為建置相依性變得非常方便。
資訊
在 Ubuntu 上,ARM64 儲存庫位於獨立的 ubuntu-ports 儲存庫中。
借助 Multiarch 功能,您可以安裝外來架構的軟體包以搭配交叉工具鏈使用。程式庫軟體包的 -dev 變體通常最具關聯性,因為它們提供了針對這些軟體包進行建置所需的標頭和程式庫。若要進行偵錯,您也可以安裝偵錯符號(-dbg 或 -dbgsym),並分別安裝對應的原始程式碼軟體包。
交叉開發工具鏈由 crossbuild-essential-arm64 軟體包提供。
原生開發#
對於應用程式開發,最方便的做法是先在目標虛擬機器(或另一台 ARM64 電腦)上原生建置和測試您的應用程式,然後再從 AMD64 開發主機進行交叉編譯。
使用 Docker 容器進行交叉建置#
上述的 Multiarch 概念已在 Smart blaze SDK 隨附的交叉建置 Docker 容器中進行了示範。該容器包含交叉開發工具鏈、pylon SDK 的開發檔案以及 pylon Supplementary Package for blaze。該容器已預先配置了用於交叉建置 ARM64 可執行檔的 CMake 工具鏈檔案。若要設定容器,請參閱 Docker Container for Development。
若要建置您自己的軟體,請擴充 Dockerfile 以安裝所需的 <packagename>-dev:arm64 相依性。在大多數情況下,這些相依性可以使用對應的 find_package CMake 呼叫來整合。例如,Docker 容器包含 libopencv-dev 軟體包。在 blaze 範例 CMakeLists.txt 檔案中,您會找到以下呼叫:
請使用 ${OpenCV_INCLUDE_DIRS} 變數搭配 target_include_directories() 會設為 ${OpenCV_LIBS} 變數搭配 target_link_libraries()使用。某些軟體包(例如 Boost)也會匯出 CMake 目標。在這種情況下,只需連結至 target_link_libraries()中的目標即可,這也會自動設定包含路徑。
如果您的相依性無法作為 Debian 軟體包取得,但提供 CMake 支援,請使用 FetchContent 模組從原始程式碼建置它們。在這種情況下,請按照專案說明中的描述,在 Docker 容器中安裝所需的建置相依性。如果程式庫不支援 CMake,您可以使用更通用的 ExternalProject 模組。
用於開發的 Docker 容器#
若要為相機開發軟體,您可以設定一個包含交叉開發工具鏈和所有必要軟體包的 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 的目錄,並在終端機中執行下列指令:
這將建立一個 Debian 容器,其中包含交叉工具鏈、用於 blaze 的 pylon SDK,以及適合交叉編譯的 CMake 設定。
在 Docker 容器中執行指令#
若要在此開發容器內執行指令,請建立下列個別名:
為了方便起見,您可以將此行加入您的 ~/.bashrc 檔案中。
影像 dockerDo alias 會將目前的工作目錄掛載到暫時容器中,並執行隨後指定的指令 dockerDo 在容器內部。掛載的目錄會用作該指令的工作目錄。該指令會在容器內部執行,其使用者 ID 與建構容器的使用者(應為目前使用者)相符。這可避免在容器內建立檔案時發生權限問題。
範例:
資訊
容器已定義環境變數 CMAKE_TOOLCHAIN_FILE,該變數會指示 CMake 使用開發容器中內含的 ARM64 交叉編譯器工具鏈。
使用 ELBE SDK(Embedded Linux Build Environment)進行交叉建構#
為了避免使用 Docker 容器以及 rootfs 和交叉建構環境的重複套件資料,可以從 elbe/blazevm.xml(與 rootfs 相同的來源)建立 Yocto 風格的 SDK。如需詳細資訊,請參閱 Building an SDK with ELBE。
對於 CMake 專案,請使用如下所示的 ELBE SDK 來處理 blaze 範例專案。請調整 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 設定檔,從頭開始建構新的根檔案系統。
目標虛擬機器 (VM) 上的執行階段程式庫
當您使用 Docker 容器或 ELBE SDK 建構軟體並將其安裝到虛擬機器 (VM) 上時,請確保所有執行階段相依性都已備妥。對於您在交叉建構環境中安裝的每一個 <packagename>-dev:arm64 套件,請在目標根檔案系統中安裝對應的程式庫套件。對於 OpenCV,所需的套件會拆分為多個模組。對於 blaze 範例,您需要 libopencv-calib3d, libopencv-core, libopencv-highgui, libopencv-imgcodecs的狀態,以及 libopencv-imgproc.