Framework模块说明
由于嵌入式Linux的硬件差异性导致的不同嵌入式板子的sysroot不同,导致不同的板子环境差异很大, 因此对于framework这个模块,需要自行根据自己板子的sysroot或者sdk进行交叉编译。
如何交叉编译Framework模块
在本项目当中,有一个适用于rk3566的framework模块, 因为framework模块一般不会使用到一些特别的硬件或者是后端(音频后端之类的), 所以理论上其他rk3566的板子也可以使用我预编译的模块。
给出交叉编译步骤(以编译我的rk3566为例):
cmake -S ../Framework -B . \
-DCMAKE_TOOLCHAIN_FILE=~/MisakiCodes/Env/rk3566-sdk/qt_toolchain.cmake \
-DCMAKE_BUILD_TYPE=Debug \
-DFRAMEWORK_SOURCE=OpenGL \
-DRENDER_INCLUDE_PATH="${CMAKE_SOURCE_DIR}/Framework/src/Rendering/OpenGL" \
-DFRAMEWORK_DEFINITIOINS="CSM_TARGET_HARMONYOS_ES3"
预期的配置输出:
CMake Warning (dev) in CMakeLists.txt:
No project() command is present. The top-level CMakeLists.txt file must
contain a literal, direct call to the project() command. Add a line of
code such as
project(ProjectName)
near the top of the file, but after cmake_minimum_required().
CMake is pretending there is a "project(Project)" command on the first
line.
This warning is for project developers. Use -Wno-dev to suppress it.
CMake Warning (dev) in CMakeLists.txt:
cmake_minimum_required() should be called prior to this top-level project()
call. Please see the cmake-commands(7) manual for usage documentation of
both commands.
This warning is for project developers. Use -Wno-dev to suppress it.
-- The C compiler identification is GNU 12.3.0
-- The CXX compiler identification is GNU 12.3.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /home/misaki/MisakiCodes/Env/rk3566-sdk/toolchain/aarch64--glibc--stable-2023.08-1/bin/aarch64-linux-gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /home/misaki/MisakiCodes/Env/rk3566-sdk/toolchain/aarch64--glibc--stable-2023.08-1/bin/aarch64-linux-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (0.5s)
-- Generating done (0.0s)
-- Build files have been written to: /home/misaki/Downloads/CubismSdkForNative-5-r.4.1/build_framework
观察上述命令可知,首先你肯定需要准备Live2D的SDK,这可以在官网下载,不在此过多赘述。
接着在与Framework的同级目录下新建一个xxx_build目录,如果你不知道这是什么,那么最好借助一下AI来帮助你。
之后就是cd到build目录里面。
Framework模块承担了Live2D的很多功能,其中唯一一个平台有关的就是Render模块, 也就是渲染功能,不过Live2D的库的渲染部分写的比较好,统一使用了OpenGL ES,同时兼容主机平台和arm移动平台。
你需要准备一个编译工具链,也就toolchain.cmake脚本的内容,这个编译工具链描述了编译器信息,sysroot信息等等。 下面给出我自己的工具链作为参考。
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(TOOLCHAIN_ROOT /home/misaki/MisakiCodes/Env/rk3566-sdk/toolchain/aarch64--glibc--stable-2023.08-1)
set(CMAKE_C_COMPILER ${TOOLCHAIN_ROOT}/bin/aarch64-linux-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_ROOT}/bin/aarch64-linux-g++)
set(CMAKE_AR ${TOOLCHAIN_ROOT}/bin/aarch64-linux-ar)
set(CMAKE_RANLIB ${TOOLCHAIN_ROOT}/bin/aarch64-linux-ranlib)
set(CMAKE_STRIP ${TOOLCHAIN_ROOT}/bin/aarch64-linux-strip)
set(SYSROOT /home/misaki/MisakiCodes/Env/rk3566-sdk/host/aarch64-buildroot-linux-gnu/sysroot)
set(VPET_SDK /home/misaki/MisakiCodes/Env/rk3566-sdk/vpet-deps)
set(QT_HOST_PATH /home/misaki/Qt/6.6.3/gcc_64)
set(CMAKE_FIND_ROOT_PATH ${SYSROOT} ${VPET_SDK})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH) # 不使用only,否则会导致CMake找不到其他库的包,例如Qt的,会直接导致FindPackage失效,只能找sysroot里面的包
set(CMAKE_C_FLAGS "-march=armv8.2-a -mtune=cortex-a55 -O2 -pipe --sysroot=${SYSROOT}")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -std=c++17")
# === 关键:强制链接 Mali 驱动和 EGL/GLES ===
set(MALI_LIBS "-lmali-hook -Wl,--whole-archive -lmali-hook-injector -Wl,--no-whole-archive -lmali -ldrm")
set(CMAKE_EXE_LINKER_FLAGS
"-Wl,-dynamic-linker=/lib/ld-linux-aarch64.so.1 \
-Wl,-rpath,/data/vpet/deps/lib:/usr/lib:/lib \
--sysroot=${SYSROOT} \
${MALI_LIBS}"
)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
# === 包含路径 ===
include_directories(
${VPET_SDK}/include
${VPET_SDK}/include/libdrm
${SYSROOT}/usr/include
)
# === 库路径 ===
link_directories(
${VPET_SDK}/lib
${SYSROOT}/usr/lib
${SYSROOT}/lib
)
# === pkg-config ===
set(ENV{PKG_CONFIG} "/usr/bin/pkg-config")
set(ENV{PKG_CONFIG_LIBDIR} "/home/misaki/MisakiCodes/Env/rk3566-sdk/qt-pkgconfig")
set(ENV{PKG_CONFIG_SYSROOT_DIR} "${SYSROOT}")
set(ENV{PKG_CONFIG_PATH} "")
# === 线程 ===
set(CMAKE_THREAD_LIBS_INIT "-lpthread")
set(THREADS_PREFER_PTHREAD_FLAG ON)
你需要根据自己的实际情况进行调整。
之前的命令是配置CMake的,编译还需:
cmake --build . --target Framework -j$(nproc)
预期的编译日志输出:
[ 7%] Building CXX object CMakeFiles/Framework.dir/src/CubismModelSettingJson.cpp.o
[ 7%] Building CXX object CMakeFiles/Framework.dir/src/CubismDefaultParameterId.cpp.o
[ 7%] Building CXX object CMakeFiles/Framework.dir/src/CubismCdiJson.cpp.o
[ 10%] Building CXX object CMakeFiles/Framework.dir/src/CubismFramework.cpp.o
[ 12%] Building CXX object CMakeFiles/Framework.dir/src/Effect/CubismEyeBlink.cpp.o
[ 15%] Building CXX object CMakeFiles/Framework.dir/src/Id/CubismId.cpp.o
[ 17%] Building CXX object CMakeFiles/Framework.dir/src/Effect/CubismPose.cpp.o
[ 20%] Building CXX object CMakeFiles/Framework.dir/src/Effect/CubismBreath.cpp.o
[ 22%] Building CXX object CMakeFiles/Framework.dir/src/Id/CubismIdManager.cpp.o
[ 25%] Building CXX object CMakeFiles/Framework.dir/src/Math/CubismMath.cpp.o
[ 27%] Building CXX object CMakeFiles/Framework.dir/src/Math/CubismMatrix44.cpp.o
[ 30%] Building CXX object CMakeFiles/Framework.dir/src/Math/CubismModelMatrix.cpp.o
[ 32%] Building CXX object CMakeFiles/Framework.dir/src/Math/CubismTargetPoint.cpp.o
[ 35%] Building CXX object CMakeFiles/Framework.dir/src/Math/CubismViewMatrix.cpp.o
[ 37%] Building CXX object CMakeFiles/Framework.dir/src/Math/CubismVector2.cpp.o
[ 40%] Building CXX object CMakeFiles/Framework.dir/src/Model/CubismMoc.cpp.o
[ 42%] Building CXX object CMakeFiles/Framework.dir/src/Model/CubismModel.cpp.o
[ 45%] Building CXX object CMakeFiles/Framework.dir/src/Model/CubismModelUserData.cpp.o
[ 47%] Building CXX object CMakeFiles/Framework.dir/src/Model/CubismModelUserDataJson.cpp.o
[ 50%] Building CXX object CMakeFiles/Framework.dir/src/Model/CubismUserModel.cpp.o
[ 52%] Building CXX object CMakeFiles/Framework.dir/src/Motion/ACubismMotion.cpp.o
[ 55%] Building CXX object CMakeFiles/Framework.dir/src/Motion/CubismExpressionMotion.cpp.o
[ 57%] Building CXX object CMakeFiles/Framework.dir/src/Motion/CubismExpressionMotionManager.cpp.o
[ 60%] Building CXX object CMakeFiles/Framework.dir/src/Motion/CubismMotion.cpp.o
[ 62%] Building CXX object CMakeFiles/Framework.dir/src/Motion/CubismMotionJson.cpp.o
[ 65%] Building CXX object CMakeFiles/Framework.dir/src/Motion/CubismMotionManager.cpp.o
[ 67%] Building CXX object CMakeFiles/Framework.dir/src/Motion/CubismMotionQueueEntry.cpp.o
[ 70%] Building CXX object CMakeFiles/Framework.dir/src/Motion/CubismMotionQueueManager.cpp.o
[ 72%] Building CXX object CMakeFiles/Framework.dir/src/Physics/CubismPhysics.cpp.o
[ 75%] Building CXX object CMakeFiles/Framework.dir/src/Rendering/CubismRenderer.cpp.o
[ 77%] Building CXX object CMakeFiles/Framework.dir/src/Physics/CubismPhysicsJson.cpp.o
[ 80%] Building CXX object CMakeFiles/Framework.dir/src/Rendering/OpenGL/CubismOffscreenSurface_OpenGLES2.cpp.o
[ 82%] Building CXX object CMakeFiles/Framework.dir/src/Rendering/OpenGL/CubismShader_OpenGLES2.cpp.o
[ 85%] Building CXX object CMakeFiles/Framework.dir/src/Rendering/OpenGL/CubismRenderer_OpenGLES2.cpp.o
[ 87%] Building CXX object CMakeFiles/Framework.dir/src/Type/csmRectF.cpp.o
[ 90%] Building CXX object CMakeFiles/Framework.dir/src/Type/csmString.cpp.o
[ 92%] Building CXX object CMakeFiles/Framework.dir/src/Utils/CubismDebug.cpp.o
[ 95%] Building CXX object CMakeFiles/Framework.dir/src/Utils/CubismJson.cpp.o
[ 97%] Building CXX object CMakeFiles/Framework.dir/src/Utils/CubismString.cpp.o
In file included from /home/misaki/Downloads/CubismSdkForNative-5-r.4.1/Framework/src/Rendering/OpenGL/../CubismClippingManager.hpp:152,
from /home/misaki/Downloads/CubismSdkForNative-5-r.4.1/Framework/src/Rendering/OpenGL/CubismRenderer_OpenGLES2.hpp:11,
from /home/misaki/Downloads/CubismSdkForNative-5-r.4.1/Framework/src/Rendering/OpenGL/CubismRenderer_OpenGLES2.cpp:8:
/home/misaki/Downloads/CubismSdkForNative-5-r.4.1/Framework/src/Rendering/OpenGL/../CubismClippingManager.tpp: In instantiation of ‘Live2D::Cubism::Framework::Rendering::CubismClippingManager<T_ClippingContext, T_OffscreenSurface>::~CubismClippingManager() [with T_ClippingContext = Live2D::Cubism::Framework::Rendering::CubismClippingContext_OpenGLES2; T_OffscreenSurface = Live2D::Cubism::Framework::Rendering::CubismOffscreenSurface_OpenGLES2]’:
/home/misaki/Downloads/CubismSdkForNative-5-r.4.1/Framework/src/Rendering/OpenGL/CubismRenderer_OpenGLES2.hpp:61:7: required from here
/home/misaki/Downloads/CubismSdkForNative-5-r.4.1/Framework/src/Rendering/OpenGL/../CubismClippingManager.tpp:66:33: warning: passing NULL to non-pointer argument 1 of ‘Live2D::Cubism::Framework::csmVector<T>::csmVector(Live2D::Cubism::Framework::csmInt32, Live2D::Cubism::Framework::csmBool) [with T = bool; Live2D::Cubism::Framework::csmInt32 = int; Live2D::Cubism::Framework::csmBool = bool]’ [-Wconversion-null]
66 | _clearedMaskBufferFlags = NULL;
| ^
In file included from /home/misaki/Downloads/CubismSdkForNative-5-r.4.1/Framework/src/Rendering/OpenGL/../CubismRenderer.hpp:12,
from /home/misaki/Downloads/CubismSdkForNative-5-r.4.1/Framework/src/Rendering/OpenGL/CubismRenderer_OpenGLES2.hpp:10:
/home/misaki/Downloads/CubismSdkForNative-5-r.4.1/Framework/src/Type/csmVector.hpp:559:34: note: declared here
559 | csmVector<T>::csmVector(csmInt32 initialCapacity, csmBool zeroClear)
| ~~~~~~~~~^~~~~~~~~~~~~~~
[100%] Linking CXX static library libFramework.a
[100%] Built target Framework