

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 針對適用於 Raspberry Pi 的 C\+\+ 生產者 SDK 的建置問題進行故障診斷
<a name="troubleshoot-rpi"></a>

如果您遇到建置問題，並想要嘗試不同的 CMake 引數，請務必執行乾淨的建置。刪除 `open-source`、 `dependency`和 `build` 資料夾，然後再試一次。

## 使用 OpenSSL 建置問題
<a name="troubleshoot-rpi-build"></a>

如果您收到類似以下的輸出，則表示 OpenSSL 未正確偵測到您的系統架構。

```
crypto/md5/md5-aarch64.S: Assembler messages:
crypto/md5/md5-aarch64.S:3: Error: unrecognized symbol type ""
crypto/md5/md5-aarch64.S:6: Error: bad instruction `stp x19,x20,[sp,#-80]!'
crypto/md5/md5-aarch64.S:7: Error: bad instruction `stp x21,x22,[sp,#16]'
crypto/md5/md5-aarch64.S:8: Error: bad instruction `stp x23,x24,[sp,#32]'
crypto/md5/md5-aarch64.S:9: Error: bad instruction `stp x25,x26,[sp,#48]'
```

在此範例中，當 Raspberry Pi 實際上是 32 位元時，它會嘗試建置 64 位元版本 (`linux-aarch64`)。有些 Raspberry Pi 裝置具有 64 位元的核心，但有 32 位元的使用者空間。

決定 OpenSSL 嘗試建置的架構。您可以在 OpenSSL `configure` 的步驟中找到日誌列：

```
[ 33%] Performing update step for 'project_libopenssl'
-- Already at requested tag: OpenSSL_1_1_1t
[ 44%] No patch step for 'project_libopenssl'
[ 55%] Performing configure step for 'project_libopenssl'
Operating system: x86_64-whatever-linux2
Configuring OpenSSL version 1.1.1t (0x1010114fL) for linux-x86_64
Using os-specific seed configuration
Creating configdata.pm
Creating Makefile
```

驗證系統的架構：
+ 檢閱核心位元程度：執行 `uname -m`
+ 檢閱使用者空間位元：執行 `getconf LONG_BIT`

您也可以使用 `cat /proc/cpuinfo`或 `lscpu`命令檢閱 CPU 資訊。

**解決方法：**

若要解決此問題，請在建置時新增下列 CMake 引數，以確保 OpenSSL 針對 32 位元 ARM 架構正確建置：

```
-DBUILD_OPENSSL_PLATFORM=linux-armv4 
```

## 對 GStreamer 中的`kvssink`載入問題進行故障診斷
<a name="troubleshoot-rpi-kvssink"></a>

確認 `GST_PLUGIN_PATH`

確保目前 Shell 工作階段中的`GST_PLUGIN_PATH`環境變數指向包含 的目錄`kvssink`。環境變數是工作階段特定的，因此您需要為每個新工作階段設定它們。若要讓此變更永久存在，請參閱「更新 shell 的啟動指令碼以包含設定 GST\_PLUGIN\_PATH 環境變數」。

**錯誤：無法開啟共用物件檔案：沒有此類檔案或目錄**

如果您遇到錯誤 `Cannot open shared object file: No such file or directory`，請執行下列命令：

```
gst-inspect-1.0 /{{path}}/{{to}}/libgstkvssink.so
```

如果您收到下列輸出，表示動態連結器找不到 所需的程式庫`kvssink`。這通常是因為：
+ `kvssink` 移至與建置位置不同的位置。
+ 交叉編譯錯誤的 CPU 架構。
+ 缺少必要的相依性。

**輸出：**

```
WARNING: erroneous pipeline: no element "kvssink"
error while loading shared libraries: libcproducer.so: cannot open shared object file: No such file or directory
```

**解決方法：**

對於**移動的程式庫**，請將包含遺失程式庫的目錄新增至 `LD_LIBRARY_PATH`。

從原始儲存庫的根目錄中，您可以使用 `find`公用程式來尋找遺失的程式庫。在終端機中，輸入：

```
find . -name "*{{libcproducer}}*" 
```

**輸出：**

```
./{{build}}/{{dependency}}/libkvscproducer/kvscproducer-src/libcproducer.so
```

Linux 裝置上的檔案路徑分隔符號為 `:`。以下命令會將新的資料夾路徑附加至現有的`LD_LIBRARY_PATH`環境變數，以保留任何先前的值。

在終端機中，輸入：

```
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/{{path}}/{{to}}/{{build}}/{{dependency}}/libkvscproducer/kvscproducer-src
```

**重要**  
環境變數是工作階段特定的。若要保留跨工作階段的變更，請修改 shell 的啟動指令碼。

您可能還需要將 `open-source/local/lib` 新增至您的 `$LD_LIBRARY_PATH`。

**錯誤：./path/to/libcproducer.so.1：無效的 ELF 標頭**

如果您在載入**共用程式庫**時收到此錯誤，可能是因為符號連結損壞 (`symlinks`)。如果主機機器的作業系統與目標機器的 作業系統不相符，Symlinks 可能會中斷。例如，Raspberry Pi 的 MacBook 上的交叉編譯。

另一個可能的原因是建置的二進位檔用於錯誤的架構。例如，如果二進位檔是針對 x86 建置的 (Raspberry Pi 使用 ARM CPUs)。

導覽至錯誤和類型中指定的程式庫位置： `ls -la`以檢查程式庫 `symlinks`。

**回應：**

```
drwxr-xr-x  16 me  staff      512 Sep 10 17:16 .
drwxr-xr-x   7 me  staff      224 Jan  6 23:46 ..
drwxr-xr-x   4 me  staff      128 Sep 10 17:16 engines-1.1
-rwxr-xr-x   1 me  staff  2294496 Sep 10 17:16 libcrypto.1.1.so
-rw-r--r--   1 me  staff  4002848 Sep 10 17:16 libcrypto.a
lrwxr-xr-x   1 me  staff       19 Sep 10 17:16 libcrypto.so -> libcrypto.1.1.so
-rwxr-xr-x   1 me  staff   631176 Sep 10 17:12 liblog4cplus-2.0.3.so
lrwxr-xr-x   1 me  staff       24 Sep 10 17:12 liblog4cplus.so -> liblog4cplus-2.0.3.so
-rwxr-xr-x   1 me  staff     1012 Sep 10 17:12 liblog4cplus.a
-rwxr-xr-x   1 me  staff   694328 Sep 10 17:12 liblog4cplusU-2.0.3.so
lrwxr-xr-x   1 me  staff       25 Sep 10 17:12 liblog4cplusU.dylib -> liblog4cplusU-2.0.3.so
-rwxr-xr-x   1 me  staff     1017 Sep 10 17:12 liblog4cplusU.a
-rwxr-xr-x   1 me  staff   536416 Sep 10 17:16 libssl.1.1.so
-rw-r--r--   1 me  staff   795184 Sep 10 17:16 libssl.a
lrwxr-xr-x   1 me  staff       16 Sep 10 17:16 libssl.so -> libssl.1.1.so
drwxr-xr-x   6 me  staff      192 Sep 10 17:16 pkgconfig
```

在上述範例輸出中， `symlinks` 不會中斷。中斷`symlinks`不會有指向其目標的箭頭。

**解決方法：**

有兩種選項可以修正符號連結：
+ **建議：**`symlink`使用 `ln`命令重新建立 。類型：

  ```
  ln -s /path/to/actual/library /path/to/symlink
  ```
+ 複製實際的程式庫檔案，並將其重新命名以符合 `symlink`。
**注意**  
此選項會導致儲存用量增加。

最佳實務是使用 Docker 等工具在相同的作業系統上編譯 ，以避免跨編譯問題。

**缺少相依性：**

如果缺少的程式庫名稱以 開頭`libkvs`，請參閱上面「移動的程式庫」一節，將 Kinesis Video Streams 程式庫從主機裝置安裝到目標裝置。

否則，請遵循 [安裝軟體先決條件](producersdk-cpp-rpi-software.md)以確保目標裝置上已安裝所有開放原始碼軟體先決條件。