정형체적 알고리즘에선 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
어플리케이션과 링크할때 링크에러가 발생하게 된다
코드를 입력하세요
상황에 대한 이해를 위해 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 심볼이 들어있다.
코드를 입력하세요
따라서, 보드 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
conan opencv consumer project 를 작성
conanfile.py
from conan import ConanFile
from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps, cmake_layout
# consumer project
class opencvTestConan(ConanFile):
settings = "os", "arch", "compiler", "build_type"
name = "opencv_test"
requires = "opencv/4.5.5"
def layout(self):
cmake_layout(self)
def generate(self):
tc = CMakeToolchain(self)
tc.generate()
deps = CMakeDeps(self)
deps.generate()
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
target
[settings]
arch=armv8
build_type=Release
compiler=gcc
compiler.cppstd=gnu14
compiler.libcxx=libstdc++
compiler.version=8
os=Linux
[buildenv]
CC=aarch64-linux-gnu-gcc-8
CXX=aarch64-linux-gnu-g++-8
STRIP=aarch64-linux-gnu-strip
[options]
opencv/*:shared=True
CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
project(opencv_test)
set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/install")
if (NOT EXISTS ${CMAKE_INSTALL_PREFIX})
file(MAKE_DIRECTORY ${CMAKE_INSTALL_PREFIX})
endif()
find_package(OpenCV REQUIRED)
add_executable(main main.cpp)
target_link_libraries(main PRIVATE ${OpenCV_LIBS})
main.cpp
#include <opencv2/opencv.hpp>
int main() {
cv::Mat image(480, 640, CV_8UC3, cv::Scalar(0, 0, 0));
cv::circle(image, cv::Point(320, 240), 100, cv::Scalar(0, 255, 0), -1);
return 0;
}
run.sh
#!/bin/bash
# gtk+-2.0.pc
export PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:$PKG_CONFIG_PATH
conan install --build missing . -pr:h=./target -c tools.system.package_manager:mode=install
cd build
source Release/generators/conanbuild.sh
cmake .. -DCMAKE_TOOLCHAIN_FILE=Release/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release
make
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
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#
링크 및 정상실행 확인
python3-pip