在瑞芯微的使用手册中,rkmedia 库使用 Buildroot 编译。然而由于配置文件众多,不易定位编译过程中的问题,所以本文以 CMake 进行构建。目标平台为 RV1109/1126。
编译 libdrm-rockchip
rkmedia 中的组件支持选项配置,但 drm 是必需的。所以第一步需要先编译该库。
首先在电脑上安装编译过程中会用到的库。
sudo apt-get install xutils-dev
sudo apt-get install libpciaccess-dev
获取 libdrm-rockchip 的源码。
git clone --recursive https://github.com/rockchip-linux/libdrm-rockchip
cd libdrm-rockchip
build.sh
ToolChain
即交叉编译工具链的位置。在项目根目录运行以下命令会将库安装到新增的install
文件。
ToolChain=/path/to/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf
export PATH="${ToolChain}/bin:$PATH"
./autogen.sh
./configure --host=arm-linux CC=${ToolChain}/bin/arm-linux-gnueabihf-gcc CXX=${ToolChain}/bin/arm-linux-gnueabihf-g++ --prefix=`pwd`/install
make -j${nproc}
make install
编译 rkmedia
获取 rkmedia 的源码:
git clone --recursive https://github.com/rockchip-linux/rkmedia
cd rkmedia
在 CMakeLists.txt 中定位到 libdrm 的部分,进行以下修改:
_FILE_OFFSET_BITS
宏使得32位系统下程序支持64位文件;- 修改
PKG_CONFIG_PATH
环境变量,避免 CMake 错误找到主机中的 drm 库; - 修复原文件中
EASY_MEDIA_DEPENDENT_LIBS
设置错误的问题。
add_definitions( -D_FILE_OFFSET_BITS=64)
set(ENV{PKG_CONFIG_PATH} "${CMAKE_SOURCE_DIR}/../libdrm-rockchip/install/lib/pkgconfig")
pkg_check_modules(LIBDRM libdrm)
if(LIBDRM_FOUND)
add_definitions(-DLIBDRM)
message(STATUS "LIBDRM_INCLUDE_DIRS ${LIBDRM_INCLUDE_DIRS}")
include_directories(${LIBDRM_INCLUDE_DIRS})
#set(EASY_MEDIA_DEPENDENT_LIBS drm)
set(EASY_MEDIA_DEPENDENT_LIBS ${LIBDRM_LINK_LIBRARIES})
else()
pkg_check_modules(LIBION libion)
if(LIBION_FOUND)
add_definitions(-DLIBION)
include_directories(${LIBION_INCLUDE_DIRS})
set(EASY_MEDIA_DEPENDENT_LIBS ion)
endif()
endif()
build.sh
CMake 交叉编译最好搭配一个相应的配置文件,可以使用 ncnn 中的 arm-linux-gnueabihf.toolchain.cmake。
mkdir -p build
cd build
ToolChain=/path/to/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf
export PATH="${ToolChain}/bin:$PATH"
cmake -DCMAKE_TOOLCHAIN_FILE=../arm-linux-gnueabihf.toolchain.cmake -DCMAKE_INSTALL_PREFIX=./install ..
echo "make -j$(nproc)"
make -j$(nproc)
make install
参考资料:
- CMake 手册详解(七)
- cmake使用教程(八)-macro和function
- [Build]cmake常用配置项
- Right way to check include files in CMAKE
- How to use CHECK_INCLUDE_FILES macro in cmake?
- CMake check_function_exists doesn’t
- How to disable narrowing conversion warnings?
- 3.19.59 x86 Options
- 3.18 GCC Developer Options
- C++中的RTTI机制
- What is the proper way to use
pkg-config
fromcmake
? - 在cmake中使用pkg-config
- CMake的pkg-config模块使用
- 在CMake中优雅使用pkg-config
- 3.15 Options for Linking
- 编译器自带的调试神器sanitizers
- 使用AddressSanitizer做内存分析
- C/C++ Sanitizer 简介
- Address Sanitizer
- Arm Porting LLVM’s Hardware-Assisted Address Sanitizer To GCC
- 3.10 Options for Debugging Your Program
- 3.17 Options for Code Generation Conventions
- gcc选项-g与-rdynamic的异同
- How to turn off gcc compiler optimization to enable buffer overflow
- GCC安全保护机制
- GCC栈溢出检测技术
- linux程序的常用保护机制
- Linux下的保护机制
- 4.4 GCC 堆栈保护技术
- 【linux】gcc编译选项:-fomit-frame-pointer,-fno-tree-vectorize,-fno-strict-aliasing以及ARM相关选项
- 关于-fno-omit-frame-pointer与-fomit-frame-pointer
- c++日志记录都有哪些好的开源项目?
- amrayn/easyloggingpp
- CMake 查找库: find_package vs pkg_check_modules
- set PKG_CONFIG_PATH in cmake
- CMakeList set CMAKE_PREFIX_PATH
- cmake 常用变量和常用环境变量查表手册—整理
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX