awtk GUI arm-linux交叉编译CMakeLists.txt实现

本文提供了一种使用CMake替代scons进行AWTK跨平台GUI库编译的方法,包括详细的CMakeLists.txt配置示例,以及用于整理源码目录的Python脚本,便于开发者进行交叉编译。

– 由于awtk官方并没有提供cmake的相关编译实现,都是用的scons,个人觉得不如cmake简单好用,不是所有东西全都套上python

  • 这里给出可以完成交叉编译的CMakeLists.txt,另外给出python拷贝源码的脚本,作用是把awtk乱七八糟的目录,统一拷贝到指定的目录,方便编译
project(awtk_gui)

set(toolchain_dir /opt/toolchain/arm-openwrt-linux-uclibcgnueabi/toolchain-arm_cortex-a5+neon_gcc-4.8-linaro_uClibc-0.9.33.2_eabi)

#Forces out of source builds just in case.
MACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD MSG)
    STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
"${CMAKE_BINARY_DIR}" insource)
    GET_FILENAME_COMPONENT(PARENTDIR ${CMAKE_SOURCE_DIR} PATH)
    STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
"${PARENTDIR}" insourcesubdir)
    IF(insource OR insourcesubdir)
        MESSAGE(FATAL_ERROR "${MSG}")
    ENDIF(insource OR insourcesubdir)
ENDMACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD)
macro_ensure_out_of_source_build("${PROJECT_NAME} requires an out of source build.")

macro(FIND_INCLUDE_DIR result curdir)  #定义函数,2个参数:存放结果result;指定路径curdir;
    file(GLOB_RECURSE children "${curdir}/*.hpp" "${curdir}/*.h" )	#遍历获取{curdir}中*.hpp和*.h文件列表
    message(STATUS "children= ${children}")								#打印*.hpp和*.h的文件列表
    set(dirlist "")														#定义dirlist中间变量,并初始化
    foreach(child ${children})											#for循环
        string(REGEX REPLACE "(.*)/.*" "\\1" LIB_NAME ${child})			#字符串替换,用/前的字符替换/*h
        if(IS_DIRECTORY ${LIB_NAME})									#判断是否为路径
            if(dirlist MATCHES ${LIB_NAME})#判断dirlist是否含有${LIB_NAME}
            else()
              MESSAGE(STATUS "current platform: Linux ")
              LIST(APPEND dirlist ${LIB_NAME})							#将合法的路径加入dirlist变量中  
            endif()
        endif()															#结束判断
    endforeach()														#结束for循环
    set(${result} ${dirlist})											#dirlist结果放入result变量中
endmacro()

if(NOT DEFINED CMAKE_INSTALL_PREFIX)
set(CMAKE_INSTALL_PREFIX $(PWD)/install)
endif()

# for cross compiling toolchain
#set(CMAKE_SYSTEM_NAME Linux)
#set(CMAKE_SYSTEM_PROCESSOR arm)
#set(tools ${toolchain_dir})

set(CMAKE_C_COMPILER ${tools}/bin/arm-openwrt-linux-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/arm-openwrt-linux-g++)

add_definitions(-Os -Wall -I.. -DSTAGING_DIR -DAPP_NAME=${PROJECT_NAME}
	-DLINUX
	-DWITH_SOCKET=1
	-DHAS_PTHREAD=1
	-DHAS_STDIO=1
	-DHAS_STD_MALLOC=1
	-DWITH_BITMAP_RGB565=1
	-DHAS_GET_TIME_US64
	)
link_directories(${CMAKE_SOURCE_DIR}/lib)

file(GLOB_RECURSE third_agge_list "awtk/3rd/agge/agge/*.cpp")
file(GLOB_RECURSE third_gpinyin_list "awtk/3rd/gpinyin/src/*.cpp")
file(GLOB_RECURSE third_unibreak_list "awtk/3rd/libunibreak/*.c")
file(GLOB_RECURSE third_nanovg_agg_list "awtk/3rd/nanovg/agge/*.cpp")
file(GLOB_RECURSE third_nanovg_base_list "awtk/3rd/nanovg/base/*.c")

file(GLOB_RECURSE awtk_tkc_list "awtk/src/tkc/*.c")
file(GLOB_RECURSE awtk_base_list "awtk/src/base/*.c")
file(GLOB_RECURSE awtk_widgets_list "awtk/src/widgets/*.c")
file(GLOB_RECURSE awtk_xml_list "awtk/src/xml/*.c")
file(GLOB_RECURSE awtk_uiloader_list "awtk/src/uiloader/*.c")
file(GLOB_RECURSE awtk_vgcanvas_list "awtk/src/vgcanvas/*.c")
file(GLOB_RECURSE awtk_blend_list "awtk/src/blend/*.c")
file(GLOB_RECURSE awtk_lcd_list "awtk/src/lcd/*.c")
file(GLOB_RECURSE awtk_ext_widgets_list "awtk/src/ext_widgets/*.c" EXCLUDE "serial_widget/*")
file(GLOB_RECURSE awtk_font_loader_list "awtk/src/font_loader/*.c")
file(GLOB_RECURSE awtk_image_loader_list "awtk/src/image_loader/*.c")
file(GLOB_RECURSE awtk_input_engines_list "awtk/src/input_engines/*.cpp")
file(GLOB_RECURSE awtk_widget_animators_list "awtk/src/widget_animators/*.c")
file(GLOB_RECURSE awtk_platforms_list "awtk/src/platforms/pc/*.c")

add_library(${PROJECT_NAME}
	awtk/src/awtk_global.c
	${awtk_tkc_list}
	${awtk_base_list}
	${awtk_widgets_list}
	${awtk_xml_list}
	${awtk_uiloader_list}
	${awtk_vgcanvas_list}
	${awtk_blend_list}
	${awtk_ext_widgets_list}
	${awtk_font_loader_list}
	${awtk_image_loader_list}
	${awtk_input_engines_list}
	awtk/src/input_methods/input_method_creator.c
	${awtk_lcd_list}
	awtk/src/main_loop/main_loop_simple.c
	awtk/src/native_window/native_window_raw.c
	awtk/src/window_manager/window_manager_default.c
	awtk/src/graphic_buffer/graphic_buffer_default.c
	${awtk_widget_animators_list}
	${awtk_platforms_list}
	
	${third_agge_list}
	${third_gpinyin_list}
	${third_unibreak_list}
	${third_nanovg_agg_list}
	${third_nanovg_base_list}
)

#message(STATUS "INCLUDE_DIR_LIST = ${agg_list}")

target_include_directories(${PROJECT_NAME} PRIVATE 
    ${CMAKE_SOURCE_DIR}/awtk/src
    ${CMAKE_SOURCE_DIR}/awtk/src/fscript_ext
    ${CMAKE_SOURCE_DIR}/awtk/src/ext_widgets
    ${CMAKE_SOURCE_DIR}/awtk/src/ext_widgets/vpage
    ${CMAKE_SOURCE_DIR}/awtk/3rd/agge
    ${CMAKE_SOURCE_DIR}/awtk/3rd/nanovg
    ${CMAKE_SOURCE_DIR}/awtk/3rd/nanovg/agge
    ${CMAKE_SOURCE_DIR}/awtk/3rd/nanovg/base    
    ${CMAKE_SOURCE_DIR}/awtk/3rd/gpinyin/include
    ${CMAKE_SOURCE_DIR}/awtk/3rd/libunibreak
    ${CMAKE_SOURCE_DIR}/awtk/3rd    
    ${CMAKE_SOURCE_DIR}/awtk/3rd/stb
    ${CMAKE_SOURCE_DIR}/awtk/3rd/sokol    
    ${CMAKE_SOURCE_DIR}/awtk/src/platforms/pc
)

target_link_libraries(${PROJECT_NAME} pthread rt)


#!/usr/bin/python

import os
import glob
import copy
import shutil
import fnmatch
import platform


# XXX: make sure no no ascii chars in the path name.

AWTK_ROOT_DIR = '../awtk';
PORT_ROOT_DIR = os.getcwd();
DST_ROOT_DIR = './output';

VGCANVAS='NANOVG'
#VGCANVAS='CAIRO'

NANOVG_BACKEND='AGGE'
#NANOVG_BACKEND='AGG'


def joinPath(root, subdir):
  return os.path.normpath(os.path.join(root, subdir))

def copyFile(src_root_dir, src, dst_root_dir, dst):
    s = joinPath(src_root_dir, src)
    d = joinPath(dst_root_dir, dst)
    
非常好的问题!你已经写好了 `toolchain-aarch64-linux.cmake` 和 `CMakeLists.txt`,现在想知道**如何正确使用它们来交叉编译你的项目为 ARM64 可执行文件**。 下面我将一步步带你完成整个流程:从目录结构、文件内容到实际构建命令,全部说明清楚 ✅ --- ## 🧩 一、项目目录结构建议 ```text my-project/ ├── CMakeLists.txt # 主构建脚本 ├── toolchain-aarch64-linux.cmake # 工具链文件(推荐放在这里或单独文件夹) ├── main.cpp # 源代码示例 └── include/ # 头文件目录(可选) ``` > 💡 小提示:你可以把工具链文件统一放在 `cmake/toolchains/` 下,但为了简单起见,我们先放在根目录。 --- ## ✅ 二、`toolchain-aarch64-linux.cmake` 内容(完整可复制) ```cmake # toolchain-aarch64-linux.cmake # 用于在 x86_64 主机上交叉编译到 AArch64 (ARM64) Linux 平台 set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR aarch64) # 设置交叉编译器前缀(需提前安装 aarch64-linux-gnu-gcc) set(TOOLCHAIN_PREFIX aarch64-linux-gnu) # 指定 C/C++ 编译器 set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc) set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++) # 可选:指定其他工具 set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}-objcopy) set(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}-objdump) set(CMAKE_SIZE ${TOOLCHAIN_PREFIX}-size) set(CMAKE_AR ${TOOLCHAIN_PREFIX}-ar) set(CMAKE_RANLIB ${TOOLCHAIN_PREFIX}-ranlib) # 控制查找库和头文件的路径行为 set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # 主机上的 cmake 工具等可以运行 set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # 库只在目标系统路径中找 set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # 头文件也只在目标系统中找 set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) ``` --- ## ✅ 三、`CMakeLists.txt` 示例(通用即可) ```cmake cmake_minimum_required(VERSION 3.10) project(MyApp LANGUAGES CXX C) # 设置标准 set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 输出目录 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) # 添加可执行文件 add_executable(${PROJECT_NAME} main.cpp) # 链接常用系统库(pthread, dl, m, rt) target_link_libraries(${PROJECT_NAME} pthread dl m rt) # 可选:根据平台定义宏 target_compile_definitions(${PROJECT_NAME} PRIVATE $<$<BOOL:${UNIX}>:PLATFORM_LINUX> $<$<CONFIG:Debug>:DEBUG_BUILD> ) ``` --- ## ✅ 四、`main.cpp` 示例代码(测试用) ```cpp #include <iostream> #include <unistd.h> int main() { std::cout << "Hello from ARM64 Linux!\n"; #ifdef __aarch64__ std::cout << "Running on AArch64 architecture.\n"; #else std::cout << "Not running on AArch64.\n"; #endif while (true) { sleep(1); } return 0; } ``` --- ## 🔧 五、准备工作:安装交叉编译工具链 如果你还没安装 `aarch64-linux-gnu-gcc`,请先安装: ### Ubuntu / Debian 用户: ```bash sudo apt update sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu ``` ### 检查是否安装成功: ```bash aarch64-linux-gnu-gcc --version ``` 你应该看到类似输出: ``` Target: aarch64-linux-gnu ... ``` --- ## 🚀 六、使用步骤:构建 ARM64 程序 ### 步骤 1:创建构建目录并进入 ```bash mkdir build-arm64 && cd build-arm64 ``` > ❗不要在源码目录直接运行 cmake! ### 步骤 2:运行 CMake 并指定工具链文件 ```bash cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain-aarch64-linux.cmake ``` > ⚠️ 注意路径要对。如果 `.cmake` 文件在当前目录,则写成 `-DCMAKE_TOOLCHAIN_FILE=./toolchain-aarch64-linux.cmake` 你会看到类似输出: ``` -- The C compiler identification is GNU ... -- The CXX compiler identification is GNU ... -- Check for working C compiler: /usr/bin/aarch64-linux-gnu-gcc -- Check for working CXX compiler: /usr/bin/aarch64-linux-gnu-g++ -- Configuring done -- Generating done -- Build files have been written to: ... ``` ✅ 表示配置成功,使用的已经是 ARM 编译器! ### 步骤 3:编译项目 ```bash make -j$(nproc) ``` 编译完成后,在 `bin/` 目录下会生成一个 **ARM64 架构的可执行文件**: ```bash ls -l bin/ # 输出示例: # MyApp (这是一个 aarch64 可执行文件) ``` --- ## 🔍 七、验证是否真的是 ARM64 程序? ```bash file bin/MyApp ``` 输出应为: ``` bin/MyApp: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, not stripped ``` ✅ 成功!这是真正的 ARM64 程序。 --- ## 📦 八、如何部署到开发板? 1. 把 `bin/MyApp` 拷贝到 ARM 开发板(如树莓派 4、RK3588、Hi3519 等): ```bash scp bin/MyApp root@192.168.1.10:/root/ ``` 2. 在开发板上运行: ```bash chmod +x MyApp ./MyApp ``` 输出: ``` Hello from ARM64 Linux! Running on AArch64 architecture. ``` 🎉 成功运行! --- ## 🎯 九、Qt Creator 中如何使用? 1. 打开 Qt Creator 2. 选择 “Open Project” → 选择你的 `CMakeLists.txt` 3. 在构建配置页面: - 点击 “Manage Kits…” - 创建一个新的 Kit 或修改现有 Kit - 在 **“CMake Toolchain File”** 字段中填入: ``` ${SOURCE_DIR}/toolchain-aarch64-linux.cmake ``` - 设置编译器为 `aarch64-linux-gnu-gcc`(如果自动识别不到) 4. 保存后点击 “Configure Project” 5. 构建 → 自动生成 ARM 可执行文件 --- ## ✅ 总结:使用流程图 ```text [准备] │ ├── 安装 aarch64-linux-gnu-gcc ├── 写好 CMakeLists.txt └── 写好 toolchain-aarch64-linux.cmake ↓ [构建] │ cd build-arm64 cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain-aarch64-linux.cmake make ↓ [结果] │ ✅ 得到 bin/MyApp(ARM64 可执行文件) ➡️ 可复制到开发板运行 ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值