Armadilloフォーラム

Armadillo実行用にライブラリがコンパイルできない

s12345678

2023年4月25日 15時04分

弊社で開発したソフトウェアで,USBカメラをArmadillo IoT-G4につなげて画像を取り込もうとしています。
このときlib_uvcというライブラリを使いたいのですが,ATDE上でコンパイル時にエラーになってしまいます。
コンパイラはaarch64-linux-gnu-gccを使用しています。
エラー情報から解析すると,恐らくlibuvc.soファイルのファイル形式がaarch64でないことが原因と考えられますが,libuvcをaarch64形式でコンパイルする方法がわかりません。

以下が実行コマンドと応答です。

---------------------------------------------------------------------------------------------------------
[ATDE ~]$ make
[ 4%] Building C object CMakeFiles/uvc.dir/src/ctrl.c.o
[ 8%] Building C object CMakeFiles/uvc.dir/src/ctrl-gen.c.o
[ 12%] Building C object CMakeFiles/uvc.dir/src/device.c.o
[ 16%] Building C object CMakeFiles/uvc.dir/src/diag.c.o
[ 20%] Building C object CMakeFiles/uvc.dir/src/frame.c.o
[ 25%] Building C object CMakeFiles/uvc.dir/src/init.c.o
[ 29%] Building C object CMakeFiles/uvc.dir/src/stream.c.o
[ 33%] Building C object CMakeFiles/uvc.dir/src/misc.c.o
[ 37%] Building C object CMakeFiles/uvc.dir/src/frame-mjpeg.c.o
[ 41%] Linking C shared library libuvc.so
/usr/lib/gcc-cross/aarch64-linux-gnu/10/../../../../aarch64-linux-gnu/bin/ld: /usr/lib/x86_64-linux-gnu/libusb-1.0.so: error adding symbols: file in wrong format
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/uvc.dir/build.make:225: libuvc.so.0.0.6] エラー 1
make[1]: *** [CMakeFiles/Makefile2:182: CMakeFiles/uvc.dir/all] エラー 2
make: *** [Makefile:149: all] エラー 2
---------------------------------------------------------------------------------------------------------

コメント

at_dominique.m…

2023年4月25日 15時50分

s12345678さん

お世話になっています、
マルティネです。

> 弊社で開発したソフトウェアで,USBカメラをArmadillo IoT-G4につなげて画像を取り込もうとしています。
> このときlib_uvcというライブラリを使いたいのですが,ATDE上でコンパイル時にエラーになってしまいます。
> コンパイラはaarch64-linux-gnu-gccを使用しています。
> エラー情報から解析すると,恐らくlibuvc.soファイルのファイル形式がaarch64でないことが原因と考えられますが,libuvcをaarch64形式でコンパイルする方法がわかりません。

そうですね、クロスビルドの設定が不完全の時のエラーに見えます。
cmake はとても使いにくいのでよく分かります…

以下のコマンドで atde9 上にビルドできました:

git clone https://github.com/libuvc/libuvc
cd libuvc
# 依存のインストール
sudo apt install libusb-1.0-0-dev:arm64 https://github.com/libuvc/libuvc/issues/109
# cmake の "toolchain file" の作成。----ラインの間をコピーしてください。
vi toolchain.cmake
-----------------------------
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_CROSSCOMPILING TRUE)
 
set(CMAKE_C_COMPILER "aarch64-linux-gnu-gcc")
set(CMAKE_CXX_COMPILER "aarch64-linux-gnu-g++")
 
set(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu)
set(CMAKE_INCLUDE_PATH  /usr/include/aarch64-linux-gnu)
set(CMAKE_LIBRARY_PATH  /usr/lib/aarch64-linux-gnu)
set(ENV{PKG_CONFIG_PATH} /usr/lib/aarch64-linux-gnu/pkgconfig)
 
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
 
# cache flags
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "c flags")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags")
-----------------------------
# cmake の実行
cmake -B build -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake
# ビルド
cmake --build build -j5

ちなみに libuvc 0.0.6 ならパッケージがありますが、debian パッケージを使わない理由が無ければパッケージをインストールすることをオススメします。

arm64 バージョンのパッケージは上の手順と同じく :arm64 でインストールできますので、今回は例えば sudo apt install libuvc-dev:arm64 でパッケージをインストールしておけば aarch64-linux-gnu-gcc で使えるようになります。

よろしくお願いします。