정형체적 알고리즘에선 opencv 라이브러리를 사용하고 있다.
opencv 라이브러리는 ubuntu22 에서, aarch64-linux-gnu-g++ 로 빌드하였는데
라이브러리에는 어떤 심볼이 들어가 있다
root@user-virtual-machine:/mnt/hgfs/shared/libopencv# strings libopencv_core.so.4.5.5 | grep GLIBCXX_3.4.30
GLIBCXX_3.4.30
_ZNSt18condition_variable4waitERSt11unique_lockISt5mutexE@GLIBCXX_3.4.30
root@user-virtual-machine:/mnt/hgfs/shared/libopencv#
🔍 Symbol:
_ZNSt18condition_variable4waitERSt11unique_lockISt5mutexE
🧩 Demangled:
std::condition_variable::wait(std::unique_lock<std::mutex>&)
이 심볼로 인해, opencv 라이브러리를 노바텍 보드에서 제공하는 rtsp
어플리케이션과 링크할때 링크에러가 발생하게 된다
libstdc++.so.6: version `GLIBCXX_3.4.30' not found
상황에 대한 이해를 위해 2가지 전략을 취하였다
chatgpt 와 대화하며 2가지 전략을 사용하였고,
구글링 과정에서 빌드구조와 의미구조가 대략적으로 정립되었다
여러번의 테스트를 통해, 3가지 감각을 만들수 있었다.
GLIBCXX_3.4.30 심볼은 GCC 12 에서 만들어진다.
https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html
GCC 12.1.0: GLIBCXX_3.4.30, CXXABI_1.3.13
ubuntu22 의 libstdc++.6.0.30 은 conan install 중 설치되는 apt 패키지에 의해 생성된 파일이다.
이 파일에 GLIBCXX_3.4.30 심볼이 들어있다.
strings libstdc++.so.6.0.30 | grep ^GLIBCXX
...
GLIBCXX_3.4.30
따라서, 보드 rootfs 에 있는 libstdc++.so.6.0.28 (GCC 9/10) 가 지원하는 범위를 넘어서게 되고
라이브러리 link 시 에러가 발생하게 된다.
root@ubuntu:~/DISK1/ns02201_linux_sdk/BSP/root-fs/rootfs# find . -name "libstdc++*"
./usr/lib/libstdc++.so.6.0.28
./usr/lib/libstdc++.so.6
root@ubuntu:~/DISK1/ns02201_linux_sdk/BSP/root-fs/rootfs#
root@ubuntu:~/DISK1/ns02201_linux_sdk/BSP/root-fs/rootfs/usr/lib# strings libstdc++.so.6.0.28 | grep ^GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
...
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_DEBUG_MESSAGE_LENGTH
root@ubuntu:~/DISK1/ns02201_linux_sdk/BSP/root-fs/rootfs/usr/lib#
보드에서 지원하는 abi standard 에 맞춰서 opencv 라이브러리를 빌드
정형체적 알고리즘을 만들고 rtsp 어플리케이션과 링크한다
경험적으로 다음 사항들을 고려하게 된다.
따라서 다음 확인작업을 수행하였다.
conan target profile 수정 (libstdc++11 --> libstdc++)
[settings]
...
compiler.libcxx=libstdc++
conan install 시 libstdc++6:arm64 가 설치된다.
설치된 파일중 libstdc++.so.6 버전을 확인한다.
root@ubuntu:/usr/lib/aarch64-linux-gnu# ls -l libstdc++.so.6
lrwxrwxrwx 1 root root 19 Mar 10 2020 libstdc++.so.6 -> libstdc++.so.6.0.25
root@ubuntu:/usr/lib/aarch64-linux-gnu#
GCC 8.1.0: libstdc++.so.6.0.25
GCC 8.1.0: GLIBCXX_3.4.25, CXXABI_1.3.11
보드 sdk 가이드에선 ubuntu18 에서 빌드할 것을 권고하고 있다.
ubuntu18 로 이동하여 gcc7 설치
apt-get install gcc-7-aarch64-linux-gnu g++-7-aarch64-linux-gnu
libgtk-2.0-dev:arm64 설치가 필요하나 일부 의존성 resolve 가 실패
aptitude 로 설치
aptitude install libgtk2.0-dev:arm64
libiconf/1.17 에서 바이너리 생성 테스트 실패
gcc-7 --> gcc-8 로 교체
sudo apt-get install gcc-8-aarch64-linux-gnu g++-8-aarch64-linux-gnu
dav1d/1.4.3 meson 에서 python 버전 테스트 실패
dav1d/1.4.3: Calling build()
dav1d/1.4.3: Meson configure cmd: meson setup --cross-file "/root/.conan2/p/b/dav1d6607e18d69b5c/b/build-release/conan/conan_meson_cross.ini" "/root/.conan2/p/b/dav1d6607e18d69b5c/b/build-release" "/root/.conan2/p/b/dav1d6607e18d69b5c/b/src" --prefix=/
dav1d/1.4.3: RUN: meson setup --cross-file "/root/.conan2/p/b/dav1d6607e18d69b5c/b/build-release/conan/conan_meson_cross.ini" "/root/.conan2/p/b/dav1d6607e18d69b5c/b/build-release" "/root/.conan2/p/b/dav1d6607e18d69b5c/b/src" --prefix=/
Meson works correctly only with python 3.7+.
You have python 3.6.9 (default, Mar 10 2023, 16:46:00)
python 3.6.9 --> python 3.8 로 교체
sudo apt install software-properties-common -y
sudo add-apt-repository ppa:deadsnakes/ppa -y
sudo apt update
apt-get install python3.8 python3.8-venv python3.8-dev -y
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2
sudo update-alternatives --config python3
There are 2 choices for the alternative python3 (providing /usr/bin/python3).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/bin/python3.8 2 auto mode
1 /usr/bin/python3.6 1 manual mode
2 /usr/bin/python3.8 2 manual mode
Press <enter> to keep the current choice[*], or type selection number: 2
python3
Python 3.8.0 (default, Dec 9 2021, 17:53:27)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
python 관련 패키지들 업그레이드 (pip, setuptools, wheel, PyYAML)
python3 -m pip install --upgrade pip setuptools wheel
sudo apt remove --purge python3-yaml
python3 -m pip install --no-cache-dir PyYAML
no module named aptpkg 에러 수정
sudo apt-get install python3-apt --reinstall
cd /usr/lib/python3/dist-packages
cp apt_pkg.cpython-[35m]-x86_64-linux-gnu.so apt_pkg.so
conan 재설치
python3 -m pip install --upgrade --no-cache-dir conan
root@ubuntu:~/opencv# conan --version
Migration: Successfully updated settings.yml
Conan version 2.15.0
root@ubuntu:~/opencv# conan --version
Conan version 2.15.0
root@ubuntu:~/opencv#
opencv 설치확인
root@ubuntu:~/.conan2/p/b/openceaa445f7da0c4/b/build/Release/lib# strings libopencv_core.so | grep ^GLIBCXX
GLIBCXX_3.4.20
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.11
GLIBCXX_3.4.9
GLIBCXX_3.4.14
GLIBCXX_3.4.19
GLIBCXX_3.4
root@ubuntu:~/.conan2/p/b/openceaa445f7da0c4/b/build/Release/lib#
https://asciinema.org/a/714858
링크 및 정상실행 확인


https://gitlab.com/feather973/opencv_armv8_porting
위 문제는 노바텍 보드에서 제공한 크로스 컴파일러를 사용하지 않아서 발생한 문제이다
conan 빌드 시 크로스 컴파일러를 쓸 경우 빌드에러가 발생할 것을 우려해서
aarch64-linux-gnu 를 썼던게 판단미스 였다.
하지만, 그 과정에서 알게된 점이 한가지 있다.
opencv 는 빌드시, 미사용 라이브러리에 대해 as-needed 옵션을 줌으로서,
의존성이 덜 걸리게 하는 옵션을 사용하고 있다.
문제는 해당기능이 ld 버전을 탄다는 점이다.
aarch64-linux-gnu-ld 버전은 아래와 같다.
ubuntu18 ld, ubuntu20 ld 는 as-needed 가 적용되어 있음에도
pthread / dl 에 대한 의존성을 제거하지 않고 있다.
root@ubuntu:~/.conan2/p/b/openc46fffbced2c04/p/lib# /root/ldd libopencv_core.so.405
0x0000000000000001 (NEEDED) Shared library: [libdl.so.2]
0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0]
0x0000000000000001 (NEEDED) Shared library: [libm.so.6]
0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x0000000000000001 (NEEDED) Shared library: [ld-linux-aarch64.so.1]
root@ubuntu:~/.conan2/p/b/openc46fffbced2c04/p/lib#
따라서, GLIBCXX 버전문제와 별개로, as-needed 미적용으로 인한 문제로
노바텍 보드에서 실행 시점에 문제가 된다.