ZED SDKをqmakeでクロスコンパイルする方法（Jetson TX1向け）

# ZED SDKのインストール

Jetson向けZED SDKをダウンロードして、Jetsonにインストールする。
https://www.stereolabs.com/developers/release/

```bash
jetson$ chmod +x ZED_SDK_JTX1_v*.run
jetson$ ./ZED_SDK_JTX1_v*.run
```

# ビルド方法を確認

サンプルプログラムのビルド方法は[こちら](https://github.com/stereolabs/zed-examples/tree/master/tutorials/tutorial%201%20-%20hello%20ZED)に書かれている。
CMakeでビルドをしており、以下のファイルでパス等を確認できる。

```bash
jetson$ vi /usr/local/zed/zed-config.cmake
```

```zed-config.cmake
# ===================================================================================
#  The ZED CMake configuration file
#
#  Usage from an external project:
#    In your CMakeLists.txt, add these lines:
#
#    SET(ZED_DIR "/usr/local/zed/")
#    FIND_PACKAGE(zed REQUIRED )
#    INCLUDE_DIRECTORIES(${ZED_INCLUDE_DIRS})
#    link_directories(${ZED_LIBRARY_DIR})
#    TARGET_LINK_LIBRARIES(MY_TARGET_NAME ${ZED_LIBRARIES})
#
#    This file will define the following variables:
#      - ZED_LIBRARIES           : The list of dynamic libraries (ZED SDK) to links against.
#      - ZED_STATIC_LIBRARIES    : The list of static libraries (ZED SDK) to links against.
#      - ZED_STATIC_DEP_LIBRARIES: The list of static libraries (ZED SDK dependencies) to links against.
#      - ZED_LIBRARY_DIR         : The directory where lib files are.
#      - ZED_INCLUDE_DIRS        : The ZED include directories.
#      - ZED_CUDA_VERSION        : The CUDA version required by the ZED SDK.
#      - CUDA_NPP_LIBRARIES_ZED  : The CUDA NPP libraries used by the ZED SDK.
# ===================================================================================

set(ZED_FOUND FALSE CACHE BOOL "" FORCE)

set(ZED_INCLUDE_DIRS "/usr/local/zed/include")　　　　★ ZED SDKのインクルードパス
set(ZED_LIBRARY_DIR "/usr/local/zed/lib")　　　　　　　★ ZED SDKのライブラリパス

if(ZED_INCLUDE_DIRS)
    set(ZED_LIBRARIES
        "/usr/local/zed/lib/libsl_input.so"         ★ ZED SDKの共有ライブラリ
        "/usr/local/zed/lib/libsl_core.so"
        "/usr/local/zed/lib/libsl_zed.so"
    )

    set(ZED_STATIC_LIBRARIES
        "/usr/local/zed/lib/libsl_zed_static.a"      ★ ZED SDKの静的ライブラリ
        "/usr/local/zed/lib/libsl_input_static.a"
        "/usr/local/zed/lib/libsl_core_static.a"
    )

    set(ZED_FOUND TRUE CACHE BOOL "" FORCE)

    exec_program(uname ARGS -p OUTPUT_VARIABLE CMAKE_SYSTEM_NAME2)
    if (CMAKE_SYSTEM_NAME2 MATCHES "aarch64" )
        unset(CUDA_USE_STATIC_CUDA_RUNTIME CACHE)
        option(CUDA_USE_STATIC_CUDA_RUNTIME OFF)
    endif()

    SET(ZED_CUDA_VERSION 9.0)

    find_package(CUDA 9.0 EXACT REQUIRED)
    if(CUDA_FOUND)
            set(cuda_path "/usr/local/cuda-${CUDA_VERSION_MAJOR}.${CUDA_VERSION_MINOR}/lib64/")　★ CUDAのライブラリパス
            set(CUDA_NPP_LIBRARIES_ZED
                                "${cuda_path}libnppial.so" 　　　　★ CUDAの共有ライブラリ
                                "${cuda_path}libnppisu.so"
                                "${cuda_path}libnppicc.so"
                                "${cuda_path}libnppicom.so"
                                "${cuda_path}libnppidei.so"
                                "${cuda_path}libnppif.so"
                                "${cuda_path}libnppig.so"
                                                                                                                                                                                          
```

# ホスト環境にファイルを転送する

## ZED SDK

JetsonにインストールしたZED SDKのファイルを、クロスビルド環境のホストPCに転送する。
ZED SDKのライブラリやインクルードファイル等は`/usr/local/zed/`フォルダにインストールされている。
JetPackのrootfsフォルダで操作を行う。（IPアドレスはJetsonのIPアドレス）

```bash
host$ cd ~/JetPack/64_TX1/Linux_for_Tegra/rootfs/usr/local
host$ sudo rsync -e ssh -avz nvidia@192.168.0.16:/usr/local/zed .
```

ZED SDKインストール時にユーザー所有権でインストールしていたので、rootに変更しておく。
パーミッションも合わせて変更しておく。

```bash
host$ sudo chown -R root zed
host$ sudo chmod -R 755 zed
```
## CUDA

同様に転送する。

```bash
host$ cd ~/JetPack/64_TX1/Linux_for_Tegra/rootfs/usr/local
host$ sudo rsync -e ssh -avz nvidia@192.168.0.16:/usr/local/cuda .
host$ sudo rsync -e ssh -avz nvidia@192.168.0.16:/usr/local/cuda-9.0 .
```

## aarch64-linux-gnu

同様に転送する。

```bash
host$ cd ~/JetPack/64_TX1/Linux_for_Tegra/rootfs/usr/lib
host$ sudo rsync -e ssh -avz nvidia@192.168.0.16:/usr/lib/aarch64-linux-gnu .
```

## シンボリックリンクの修正

以下のスクリプトを利用し、ホスト側にコピーしたシンボリックリンクをホスト向けに修正する。
https://github.com/alpqr/fixsymlinks_tx1

```bash
host$ chmod +x fixsymlinks.sh
host$ sudo ./fixsymlinks.sh ~/JetPack/64_TX1/Linux_for_Tegra/rootfs
```


# クロスビルドで Hello ZED する

# sysroot設定

Qt Creatorを起動する。
オプションでSysrootにJetPackのrootfsを指定しておくこと。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/266169/5f95ab83-c72a-a6b1-cf65-8ebb452486a5.png)

# プロジェクトファイル設定

`INCLUDEPATH`と`LIBS`にZEDとCUDAのパスを通す。

```.pro
INCLUDEPATH += /home/ubuntu/JetPack/64_TX1/Linux_for_Tegra/rootfs/usr/local/zed/include \
               /home/ubuntu/JetPack/64_TX1/Linux_for_Tegra/rootfs/usr/local/cuda/include

LIBS += -L/home/ubuntu/JetPack/64_TX1/Linux_for_Tegra/rootfs/usr/local/zed/lib \
            -lsl_input \
            -lsl_core \
            -lsl_zed \
        -L/home/ubuntu/JetPack/64_TX1/Linux_for_Tegra/rootfs/usr/local/cuda/lib64 \
            -lnppial \
            -lnppisu \
            -lnppicc \
            -lnppicom \
            -lnppidei \
            -lnppif \
            -lnppig \
            -lnppim \
            -lnppist \
            -lnppitc \
            -lnpps \
            -lnppc
```

これでサンプルプログラムがqmakeでビルドできるようになる。
参考までに、QtでZED tutorial 1をビルドしたソースコードを[GitHub](https://github.com/otomon10/jetson-qt/tree/master/hello_zed)に置いた。