SA8155QNX平台(aarch64le)交叉编译harfbuzz库

1.背景

在qnx系统中显示印地语时,使用lvgl + freetype无法正常显示,需要使用harfbuzz库对字体整形。FreeType 负责“画字形”,HarfBuzz 负责“选字形+排字形”。

2.HarfBuzz的作用

输入: "ffi"
↓
Unicode 正规化
↓
查找字体(OpenType tables)
↓
执行替换规则(GSUB)
  "f" + "f" + "i" → "ffi ligature glyph"
↓
计算定位规则(GPOS)
↓
输出: 字形ID + 位置坐标

如何根据 Unicode + 字体表(OpenType GSUB/GPOS)去决定显示哪个字形、放哪儿——就是 harfbuzz 的工作。

3.准备材料

QNX700的交叉工具链:qnx700_sdp
HarfBuzz源码:(https://github.com/harfbuzz/harfbuzz)
以harfbuzz-z 8.3.0为例:
1.创建一个build-qnx目录;
在这里插入图片描述

2.创建CMAKE_TOOLCHAIN_FILE文件:qnx-toolchain.cmake

CMAKE_TOOLCHAIN_FILE 是一个路径变量,告诉 CMake:
“我不是在本机(host)上编译,而是要在一个目标平台(target)上运行的程序,请使用这个交叉编译工具链文件。”
它定义了:
使用哪个 编译器(gcc/g++/qcc 等)
目标系统的 CPU 架构(如 aarch64le)
目标系统的 操作系统类型(如 QNX)
搜索头文件 / 库文件的路径
工具链的环境变量(如 $QNX_TARGET、$QNX_HOST)

内容如下:

# ==================== 系统配置 ====================
set(CMAKE_SYSTEM_NAME QNX)
set(CMAKE_SYSTEM_VERSION 7.0)
set(CMAKE_SYSTEM_PROCESSOR aarch64)

# ==================== QNX 路径 ====================
set(QNX_HOST "/home/jwf/Desktop/qnx700_sdp/host/linux/x86_64")
set(QNX_TARGET "/home/jwf/Desktop/qnx700_sdp/target/qnx7")

# ==================== 编译器配置 ====================
set(CMAKE_C_COMPILER "${QNX_HOST}/usr/bin/qcc")
set(CMAKE_CXX_COMPILER "${QNX_HOST}/usr/bin/qcc")
set(CMAKE_AR "${QNX_HOST}/usr/bin/ntoaarch64-ar" CACHE FILEPATH "Archiver")
set(CMAKE_RANLIB "${QNX_HOST}/usr/bin/ntoaarch64-ranlib" CACHE FILEPATH "Ranlib")
set(CMAKE_STRIP "${QNX_HOST}/usr/bin/ntoaarch64-strip" CACHE FILEPATH "Strip")

# ==================== 编译标志 ====================
set(CMAKE_C_FLAGS "-Vgcc_ntoaarch64le" CACHE STRING "C compiler flags")
set(CMAKE_CXX_FLAGS "-Vgcc_ntoaarch64le -lang-c++" CACHE STRING "C++ compiler flags")
set(CMAKE_EXE_LINKER_FLAGS "-Vgcc_ntoaarch64le" CACHE STRING "Executable linker flags")
set(CMAKE_SHARED_LINKER_FLAGS "-Vgcc_ntoaarch64le" CACHE STRING "Shared library linker flags")
set(CMAKE_STATIC_LINKER_FLAGS "" CACHE STRING "Static library linker flags")

# ==================== 搜索路径配置 ====================
set(CMAKE_FIND_ROOT_PATH "${QNX_TARGET}")
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 ONLY)

# ==================== 系统配置 ====================
set(CMAKE_CROSSCOMPILING TRUE)
set(CMAKE_SYSTEM_PREFIX_PATH "${QNX_TARGET}")

# ==================== FreeType 配置(使用 .so)====================
# FreeType 头文件路径
set(FREETYPE_INCLUDE_DIRS 
    "${QNX_TARGET}/usr/include/freetype"
    "${QNX_TARGET}/usr/include"
    CACHE PATH "FreeType include directories"
)

# FreeType 动态库路径 - 根据实际情况选择一个
# 选项 1: 如果在 aarch64le/lib 目录
set(FREETYPE_LIBRARY "${QNX_TARGET}/aarch64le/lib/libfreetype.so" CACHE FILEPATH "FreeType library")

# 选项 2: 如果在 aarch64le/usr/lib 目录(取消注释使用)
# set(FREETYPE_LIBRARY "${QNX_TARGET}/aarch64le/usr/lib/libfreetype.so" CACHE FILEPATH "FreeType library")

# 选项 3: 如果在 usr/lib 目录(取消注释使用)
# set(FREETYPE_LIBRARY "${QNX_TARGET}/usr/lib/libfreetype.so" CACHE FILEPATH "FreeType library")

# 选项 4: 只指定库名,让链接器自动查找(推荐)
# set(FREETYPE_LIBRARY "freetype" CACHE STRING "FreeType library")

set(FREETYPE_LIBRARIES "${FREETYPE_LIBRARY}" CACHE STRING "FreeType libraries")
set(FREETYPE_FOUND TRUE CACHE BOOL "FreeType found")

# 添加库搜索路径
link_directories("${QNX_TARGET}/aarch64le/lib")
link_directories("${QNX_TARGET}/aarch64le/usr/lib")
link_directories("${QNX_TARGET}/usr/lib")

# ==================== 其他配置 ====================
set(CMAKE_SKIP_RPATH TRUE)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

# 打印配置信息(调试用)
message(STATUS "==================== QNX Toolchain ====================")
message(STATUS "QNX_HOST: ${QNX_HOST}")
message(STATUS "QNX_TARGET: ${QNX_TARGET}")
message(STATUS "CMAKE_C_COMPILER: ${CMAKE_C_COMPILER}")
message(STATUS "CMAKE_CXX_COMPILER: ${CMAKE_CXX_COMPILER}")
message(STATUS "==================== FreeType Config ====================")
message(STATUS "FREETYPE_INCLUDE_DIRS: ${FREETYPE_INCLUDE_DIRS}")
message(STATUS "FREETYPE_LIBRARY: ${FREETYPE_LIBRARY}")
message(STATUS "FREETYPE_LIBRARIES: ${FREETYPE_LIBRARIES}")
message(STATUS "========================================================")

4.准备编译

1)配置QNX 交叉编译环境的核心环境变量设置,输入三条指令

  //主机端工具链所在目录,里面包含
  环境编译器(qcc, gcc_ntoaarch64le, make, ld, strip)
  辅助工具(pidin, cpufreq, mkifs, dumpifs, 等)
  用于构建 QNX 应用程序的开发工具
 指令1:
 export QNX_HOST="/home/jwf/Desktop/qnx700_sdp/host/linux/x86_64"
  
//目标系统库和头文件所在目录
目标平台的 include 文件 (/usr/include)
目标平台的库文件 (/usr/lib)
各 CPU 架构(如 aarch64le, x86, armle-v7)的系统镜像与驱动文件
 指令2:
 export QNX_TARGET="/home/jwf/Desktop/qnx700_sdp/target/qnx7"
 
 //QNX 的交叉编译工具加入系统 PATH,使得在任何地方都能使用 qcc 等命令
 指令3:
 export PATH="${QNX_HOST}/usr/bin:${PATH}"

总结:用宿主主机的编译器通过找寻目标系统库和头文件编译出可用于目标系统的可执行的库或者程序。
查看环境变量是否配置成功:

//查看环境变量是否生效:
echo "QNX_HOST: $QNX_HOST"
echo "QNX_TARGET: $QNX_TARGET"
QNX_HOST: /home/jwf/Desktop/qnx700_sdp/host/linux/x86_64
QNX_TARGET: /home/jwf/Desktop/qnx700_sdp/target/qnx7

检查编译器路径:

which qcc
/home/jwf/Desktop/qnx700_sdp/host/linux/x86_64/usr/bin/qcc

查看编译器版本与支持架构,这里看出是支持qnx架构编译的

cc: targets available in /home/jwf/Desktop/qnx700_sdp/host/linux/x86_64/etc/qcc:
	5.4.0,gcc_ntoaarch64le_cxx	//这个可以看出
	5.4.0,gcc_ntox86_cxx	
	5.4.0,gcc_ntoaarch64le_gpp	
	5.4.0,gcc_ntoarmv7le	
	5.4.0,gcc_ntox86_64_gpp	
	5.4.0,gcc_ntoarmv7le_gpp	
	5.4.0,gcc_ntoarmv7le_cxx	
	5.4.0,gcc_ntox86_64	
	5.4.0,gcc_ntox86_64_cxx	
	5.4.0,gcc_ntoaarch64le	
	5.4.0,gcc_ntox86_gpp	
	5.4.0,gcc_ntox86	(default)

2)使用 CMake 为 HarfBuzz 库生成适用于 QNX 平台的交叉编译 Makefile。
输入指令

 cmake .. \
  -DCMAKE_TOOLCHAIN_FILE=qnx-toolchain.cmake \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_INSTALL_PREFIX=../harfbuzz-install \
  -DBUILD_SHARED_LIBS=OFF \
  -DHB_HAVE_FREETYPE=ON \
  -DHB_HAVE_GLIB=OFF \
  -DHB_HAVE_ICU=OFF \
  -DHB_BUILD_TESTS=OFF \
  -DHB_BUILD_SUBSET=OFF

详解:
1.我要为 QNX aarch64le 平台构建;
2.构建类型是 Release(优化版);
3.使用 FreeType 支持;
4.不依赖 GLib / ICU;
5.不生成测试程序;
6.生成静态库(BUILD_SHARED_LIBS=OFF);
7.安装到指定目录 …/harfbuzz-install。
接下来Cmake会做的事情
读取源码目录里的 CMakeLists.txt;
根据 qnx-toolchain.cmake 配置加载 QNX 编译器环境(qcc -Vgcc_ntoaarch64le);
检查依赖库(例如是否能找到 FreeType 的头文件和库);
根据你的选项生成一个 Makefile 或 Ninja 构建文件;
在当前目录创建 CMakeCache.txt,记录你的构建配置
3)配置成功后编译源码harfbuzz-z 8.3.0

make -j8
make install

CMake 会:编译 HarfBuzz 的 .a 或 .so 库,安装到你指定的目录 …/harfbuzz-install/lib 和 …/harfbuzz-install/include
harfbuzz头文件
harfbuzz静态库

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值