Qt AFSim雷达显控终端飞腾D3000适配教程
目录
平台概述




飞腾D3000处理器特性
- 架构: ARM64 (aarch64)
- 指令集: ARMv8-A
- 典型操作系统: 银河麒麟桌面操作系统V10 (UKUI桌面环境)
- 内核版本: Linux 5.4.x (如 5.4.18-110-generic)
项目适配要点
本项目是基于Qt5的C++雷达显控终端,包含以下核心模块:
cic- 主应用程序radarmap- 雷达地图库(依赖QGIS)situation- 态势处理库(依赖Fast DDS)
适配飞腾D3000需要:
- 使用ARM64架构的Qt5库
- 使用ARM64架构的QGIS库
- 使用ARM64架构的Fast DDS库
- 修改CMake配置以支持Linux/ARM64平台
- 调整运行时路径配置
环境准备
1. 操作系统要求
- 操作系统: 银河麒麟桌面操作系统V10 (SP1) 或更高版本
- 桌面环境: UKUI
- 系统架构: aarch64
2. 开发工具链安装
bash
# 更新系统包管理器
sudo apt update
# 安装基础开发工具
sudo apt install -y build-essential cmake ninja-build git
# 验证CMake版本(需要3.16+)
cmake --version
# 验证编译器
gcc --version
g++ --version
3. Qt5安装
方法一:使用系统包管理器安装(推荐)
bash
# 安装Qt5开发库
sudo apt install -y qtbase5-dev qtbase5-dev-tools \
qttools5-dev qttools5-dev-tools \
libqt5opengl5-dev libqt5xml5-dev
# 验证Qt5安装
qmake --version
方法二:从Qt官方安装器安装
- 下载Qt5安装器(支持ARM64)
- 安装Qt5.12或更高版本
- 选择以下组件:
- Qt 5.12.x / Qt 5.15.x
- Qt Charts
- Qt OpenGL
- Qt XML
设置环境变量:
bash
export Qt5_DIR=/opt/Qt5.15.2/5.15.2/gcc_64/lib/cmake/Qt5
export PATH=/opt/Qt5.15.2/5.15.2/gcc_64/bin:$PATH
依赖库安装
1. QGIS安装
方法一:从银河麒麟软件仓库安装
bash
# 添加QGIS仓库(如果可用)
sudo apt install -y qgis qgis-dev
# 验证QGIS安装
qgis --version
方法二:从源码编译QGIS(ARM64)
如果系统仓库没有QGIS,需要从源码编译:
bash
# 安装QGIS依赖
sudo apt install -y \
libqgis-dev libqgis-core libqgis-gui \
libgdal-dev libproj-dev libgeos-dev \
libspatialindex-dev libsqlite3-dev
# 设置QGIS路径环境变量
export QGIS_PREFIX_PATH=/usr
export QGIS_PLUGINPATH=/usr/lib/qgis/plugins
2. Fast DDS安装
从源码编译Fast DDS(ARM64)
bash
# 安装Fast DDS依赖
sudo apt install -y \
libasio-dev libtinyxml2-dev \
libssl-dev libp11-dev
# 下载Fast DDS源码
cd /tmp
git clone https://github.com/eProsima/Fast-DDS.git
cd Fast-DDS
# 编译安装
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local
make -j$(nproc)
sudo make install
# 设置环境变量
export FASTRTPSHOME=/usr/local
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
3. 其他依赖库
bash
# 安装项目所需的其他依赖
sudo apt install -y \
libgl1-mesa-dev libglu1-mesa-dev \
libx11-dev libxext-dev libxrender-dev \
libfontconfig1-dev libfreetype6-dev
CMake配置修改
1. 修改根目录CMakeLists.txt
在项目根目录的 CMakeLists.txt 中,需要添加Linux/ARM64平台支持:
cmake
cmake_minimum_required(VERSION 3.16)
project(diting VERSION 0.1 LANGUAGES CXX)
# 设置C++标准
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 设置默认构建类型为Release
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
message(STATUS "Setting default build type to Release")
endif()
# 平台特定配置
if(MSVC)
add_compile_options(/utf-8)
add_compile_options(/W0)
add_compile_definitions(_SILENCE_STDEXT_ARR_ITERS_DEPRECATION_WARNING)
add_compile_definitions(_SILENCE_ALL_MS_EXT_DEPRECATION_WARNINGS)
add_compile_options(/wd4819 /wd4996 /wd4244)
elseif(UNIX)
# Linux平台配置
add_compile_options(-Wall -Wextra)
# ARM64特定优化
if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64")
add_compile_options(-march=armv8-a)
message(STATUS "Building for ARM64 architecture")
endif()
endif()
# 设置并行构建
if(NOT CMAKE_BUILD_PARALLEL_LEVEL)
include(ProcessorCount)
ProcessorCount(NUM_PROCESSORS)
if(NUM_PROCESSORS EQUAL 0)
set(CMAKE_BUILD_PARALLEL_LEVEL 8)
else()
set(CMAKE_BUILD_PARALLEL_LEVEL ${NUM_PROCESSORS})
endif()
message(STATUS "Setting parallel build level to ${CMAKE_BUILD_PARALLEL_LEVEL}")
endif()
# Qt5路径配置(Linux)
if(UNIX)
# 优先使用系统安装的Qt5
find_package(Qt5 QUIET COMPONENTS Core)
if(Qt5_FOUND)
message(STATUS "Using system Qt5 installation")
else()
# 尝试自定义路径
set(QT5_BASE_PATH "$ENV{Qt5_DIR}")
if(EXISTS "${QT5_BASE_PATH}")
list(APPEND CMAKE_PREFIX_PATH "${QT5_BASE_PATH}")
endif()
endif()
endif()
# Windows特定配置(保留原有逻辑)
if(WIN32)
set(OSGEO4W_ROOT_DIR "$ENV{OSGeo4W_ROOT}")
if(NOT OSGEO4W_ROOT_DIR OR OSGEO4W_ROOT_DIR STREQUAL "")
set(OSGEO4W_ROOT_DIR "C:/OSGeo4W")
endif()
# ... Windows配置 ...
endif()
# 输出目录设置
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
add_subdirectory(situation)
add_subdirectory(radarmap)
add_subdirectory(cic)
2. 修改cic/CMakeLists.txt
cmake
cmake_minimum_required(VERSION 3.16)
project(cic VERSION 0.1 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
# 平台特定编译选项
if(MSVC)
add_compile_options(/utf-8)
target_link_options(${PROJECT_NAME} PRIVATE /MANIFEST:NO)
target_link_options(${PROJECT_NAME} PRIVATE
$<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:/INCREMENTAL>
$<$<CONFIG:Release>:/DEBUG:NONE>
)
endif()
find_package(Qt5 REQUIRED COMPONENTS Widgets OpenGL)
file(GLOB_RECURSE SOURCES *.cpp *.h *.ui *.qrc)
add_executable(${PROJECT_NAME} ${SOURCES})
# Linux平台不需要WIN32_EXECUTABLE
if(WIN32)
set_target_properties(${PROJECT_NAME} PROPERTIES
WIN32_EXECUTABLE TRUE
)
endif()
target_include_directories(${PROJECT_NAME} PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/radarmap/source/common
${CMAKE_SOURCE_DIR}/situation/include
)
target_include_directories(${PROJECT_NAME} PUBLIC
${CMAKE_SOURCE_DIR}/include
)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Widgets Qt5::OpenGL radarmap situation)
# Windows特定的运行时依赖打包(保留原有逻辑)
if(WIN32 AND BUNDLE_RUNTIME)
# ... Windows依赖复制逻辑 ...
endif()
# Linux平台运行时依赖处理
if(UNIX)
# 设置RPATH,确保运行时能找到依赖库
set_target_properties(${PROJECT_NAME} PROPERTIES
INSTALL_RPATH_USE_LINK_PATH TRUE
BUILD_WITH_INSTALL_RPATH TRUE
)
# 可选:安装规则
install(TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
)
endif()
3. 修改radarmap/CMakeLists.txt
cmake
project(radarmap VERSION 0.1 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
# 平台特定的模块路径
if(MSVC)
add_compile_options(/utf-8)
list(APPEND CMAKE_MODULE_PATH $ENV{OSGeo4W_ROOT}/apps/qgis)
elseif(UNIX)
# Linux平台QGIS查找路径
list(APPEND CMAKE_MODULE_PATH
"/usr/share/qgis"
"/usr/lib/cmake/qgis"
"$ENV{QGIS_PREFIX_PATH}/share/cmake"
)
endif()
find_package(Qt5 REQUIRED COMPONENTS Widgets Xml)
find_package(QGIS REQUIRED)
file(GLOB_RECURSE SOURCES *.cpp *.h *.ui *.qrc)
add_library(${PROJECT_NAME} SHARED ${SOURCES})
target_include_directories(${PROJECT_NAME}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
${QGIS_INCLUDE_DIR}
${CMAKE_SOURCE_DIR}/situation/include
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/source
${CMAKE_CURRENT_SOURCE_DIR}/source/common
${CMAKE_CURRENT_SOURCE_DIR}/source/graphicsitems
${CMAKE_CURRENT_SOURCE_DIR}/source/qgsmap
)
target_compile_definitions(${PROJECT_NAME} PRIVATE RADAR_LIBRARY)
target_compile_definitions(${PROJECT_NAME} PUBLIC _USE_MATH_DEFINES)
target_link_libraries(${PROJECT_NAME} PUBLIC
Qt5::Widgets
Qt5::Xml
${QGIS_CORE_LIBRARY}
${QGIS_GUI_LIBRARY}
situation
)
set_target_properties(radarmap PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)
# Linux平台RPATH设置
if(UNIX)
set_target_properties(${PROJECT_NAME} PROPERTIES
INSTALL_RPATH_USE_LINK_PATH TRUE
BUILD_WITH_INSTALL_RPATH TRUE
)
endif()
4. 修改situation/CMakeLists.txt
cmake
cmake_minimum_required(VERSION 3.16)
project(situation LANGUAGES CXX)
set(CMAKE_AUTOMOC ON)
# Fast DDS路径配置
if(UNIX)
# Linux平台Fast DDS路径
list(APPEND CMAKE_PREFIX_PATH
$ENV{FASTRTPSHOME}
$ENV{FASTRTPSHOME}/lib
$ENV{FASTRTPSHOME}/lib/cmake
$ENV{FASTRTPSHOME}/cmake
/usr/local
/usr/local/lib/cmake
)
endif()
find_package(Qt5 REQUIRED COMPONENTS Core)
find_package(fastcdr QUIET)
find_package(fastrtps QUIET)
file(GLOB_RECURSE SOURCES *.cpp *.h *.cxx)
add_library(${PROJECT_NAME} SHARED ${SOURCES})
target_include_directories(${PROJECT_NAME}
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/dds
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/source
)
target_compile_definitions(${PROJECT_NAME} PRIVATE SITUATION_LIBRARY)
target_link_libraries(${PROJECT_NAME}
PUBLIC
Qt5::Core
)
# Link Fast DDS runtime libs if found
if(fastrtps_FOUND)
target_link_libraries(${PROJECT_NAME} PRIVATE fastrtps)
message(STATUS "Fast DDS found and linked")
else()
message(WARNING "Fast DDS not found, some features may not work")
endif()
if(fastcdr_FOUND)
target_link_libraries(${PROJECT_NAME} PRIVATE fastcdr)
endif()
# Linux平台RPATH设置
if(UNIX)
set_target_properties(${PROJECT_NAME} PROPERTIES
INSTALL_RPATH_USE_LINK_PATH TRUE
BUILD_WITH_INSTALL_RPATH TRUE
)
endif()
5. 修改cic/main.cpp
需要修改QGIS初始化逻辑以支持Linux平台:
cpp
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling, false);
QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps, false);
QApplication a(argc, argv);
#ifdef Q_OS_WIN
// Windows平台QGIS初始化
const QString appDir = QCoreApplication::applicationDirPath();
const QString qgisPrefix = appDir + "/qgis";
const QString projLib = appDir + "/share/proj";
const QString gdalData = appDir + "/share/gdal";
QgsApplication::setPrefixPath(qgisPrefix, true);
qputenv("QGIS_PREFIX_PATH", qgisPrefix.toUtf8());
qputenv("QGIS_PLUGINPATH", (qgisPrefix + "/plugins").toUtf8());
qputenv("PROJ_LIB", projLib.toUtf8());
qputenv("GDAL_DATA", gdalData.toUtf8());
QgsApplication::initQgis();
#elif defined(Q_OS_LINUX)
// Linux平台QGIS初始化
// 优先使用环境变量,否则使用系统默认路径
QString qgisPrefix = qgetenv("QGIS_PREFIX_PATH");
if (qgisPrefix.isEmpty()) {
qgisPrefix = "/usr"; // 系统默认安装路径
}
QString pluginPath = qgetenv("QGIS_PLUGINPATH");
if (pluginPath.isEmpty()) {
pluginPath = qgisPrefix + "/lib/qgis/plugins";
}
QString projLib = qgetenv("PROJ_LIB");
if (projLib.isEmpty()) {
projLib = "/usr/share/proj";
}
QString gdalData = qgetenv("GDAL_DATA");
if (gdalData.isEmpty()) {
gdalData = "/usr/share/gdal";
}
QgsApplication::setPrefixPath(qgisPrefix, true);
qputenv("QGIS_PREFIX_PATH", qgisPrefix.toUtf8());
qputenv("QGIS_PLUGINPATH", pluginPath.toUtf8());
qputenv("PROJ_LIB", projLib.toUtf8());
qputenv("GDAL_DATA", gdalData.toUtf8());
QgsApplication::initQgis();
#endif
// ... 其余代码保持不变 ...
}
编译构建
1. 配置构建环境
创建构建脚本 build_ft_d3000.sh:
bash
#!/bin/bash
# 飞腾D3000构建脚本
# 设置环境变量
export Qt5_DIR=/usr/lib/aarch64-linux-gnu/cmake/Qt5
export QGIS_PREFIX_PATH=/usr
export QGIS_PLUGINPATH=/usr/lib/qgis/plugins
export PROJ_LIB=/usr/share/proj
export GDAL_DATA=/usr/share/gdal
export FASTRTPSHOME=/usr/local
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
# 创建构建目录
mkdir -p build-ft-d3000
cd build-ft-d3000
# 配置CMake
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_COMPILER=gcc \
-DCMAKE_CXX_COMPILER=g++ \
-G Ninja
# 编译
ninja -j$(nproc)
echo "构建完成!可执行文件位于: build-ft-d3000/bin/cic"
2. 执行构建
bash
# 赋予执行权限
chmod +x build_ft_d3000.sh
# 执行构建
./build_ft_d3000.sh
3. 验证构建结果
bash
# 检查可执行文件
file build-ft-d3000/bin/cic
# 应该显示: ELF 64-bit LSB executable, ARM aarch64
# 检查依赖库
ldd build-ft-d3000/bin/cic
运行时配置
1. 设置运行时环境变量
创建启动脚本 run_cic.sh:
bash
#!/bin/bash
# 设置QGIS环境变量
export QGIS_PREFIX_PATH=/usr
export QGIS_PLUGINPATH=/usr/lib/qgis/plugins
export PROJ_LIB=/usr/share/proj
export GDAL_DATA=/usr/share/gdal
# 设置Fast DDS环境变量
export FASTRTPSHOME=/usr/local
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
# 设置Qt插件路径
export QT_PLUGIN_PATH=/usr/lib/aarch64-linux-gnu/qt5/plugins
# 运行程序
cd "$(dirname "$0")"
./bin/cic "$@"
2. 创建桌面快捷方式
创建 AFSim雷达显控端.desktop:
ini
[Desktop Entry]
Version=1.0
Type=Application
Name=AFSim雷达显控端
Comment=AFSim雷达显控终端
Exec=/path/to/your/app/run_cic.sh
Icon=/path/to/your/app/icon.png
Terminal=false
Categories=Application;Utility;
3. 系统服务配置(可选)
如果需要作为系统服务运行,创建systemd服务文件 /etc/systemd/system/afsim-cic.service:
ini
[Unit]
Description=AFSim Radar Control Terminal
After=network.target
[Service]
Type=simple
User=your_username
Environment="QGIS_PREFIX_PATH=/usr"
Environment="QGIS_PLUGINPATH=/usr/lib/qgis/plugins"
Environment="PROJ_LIB=/usr/share/proj"
Environment="GDAL_DATA=/usr/share/gdal"
Environment="FASTRTPSHOME=/usr/local"
Environment="LD_LIBRARY_PATH=/usr/local/lib"
ExecStart=/path/to/your/app/bin/cic
Restart=on-failure
[Install]
WantedBy=multi-user.target
常见问题与解决方案
1. Qt5找不到
问题: CMake配置时提示找不到Qt5
解决方案:
bash
# 检查Qt5安装
dpkg -l | grep qt5
# 手动指定Qt5路径
cmake .. -DQt5_DIR=/usr/lib/aarch64-linux-gnu/cmake/Qt5
2. QGIS库找不到
问题: 链接时提示找不到QGIS库
解决方案:
bash
# 安装QGIS开发包
sudo apt install -y libqgis-dev
# 检查QGIS库位置
find /usr -name "libqgis*.so" 2>/dev/null
# 设置环境变量
export QGIS_INCLUDE_DIR=/usr/include/qgis
export QGIS_LIBRARY_DIR=/usr/lib
3. Fast DDS链接错误
问题: 找不到fastrtps或fastcdr库
解决方案:
bash
# 检查Fast DDS安装
ls -la /usr/local/lib/libfastrtps*
ls -la /usr/local/lib/libfastcdr*
# 更新动态链接库缓存
sudo ldconfig
# 设置环境变量
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
4. 运行时缺少共享库
问题: 运行时提示找不到.so文件
解决方案:
bash
# 查看程序依赖
ldd bin/cic
# 将缺失的库路径添加到LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH
# 或者创建符号链接
sudo ln -s /path/to/library.so /usr/lib/
sudo ldconfig
5. OpenGL相关错误
问题: OpenGL上下文创建失败
解决方案:
bash
# 安装Mesa驱动
sudo apt install -y mesa-utils libgl1-mesa-glx libglu1-mesa
# 检查OpenGL支持
glxinfo | grep "OpenGL version"
# 如果是远程桌面,可能需要设置
export DISPLAY=:0
6. 字体显示问题
问题: 中文或特殊字符显示异常
解决方案:
bash
# 安装中文字体
sudo apt install -y fonts-wqy-microhei fonts-wqy-zenhei
# 设置字体环境变量
export QT_QPA_FONTDIR=/usr/share/fonts
7. 性能问题
问题: 程序运行缓慢
解决方案:
- 检查是否使用了Release构建
- 启用编译器优化选项
- 检查系统资源使用情况
- 考虑使用硬件加速(如果支持)
性能优化建议
1. 编译优化
在CMakeLists.txt中添加优化选项:
cmake
if(CMAKE_BUILD_TYPE STREQUAL "Release")
add_compile_options(-O3 -march=native)
add_link_options(-O3)
endif()
2. 运行时优化
- 使用SSD存储提高I/O性能
- 确保有足够的内存(建议32GB+)
- 关闭不必要的后台服务
- 使用性能模式(而非省电模式)
3. Qt优化
cpp
// 在main.cpp中
QApplication::setAttribute(Qt::AA_UseDesktopOpenGL); // 使用桌面OpenGL
QApplication::setAttribute(Qt::AA_ShareOpenGLContexts); // 共享OpenGL上下文
4. QGIS优化
cpp
// 设置QGIS渲染选项
QgsSettings().setValue("/qgis/enable_render_caching", true);
QgsSettings().setValue("/qgis/max_threads", QThread::idealThreadCount());
验证清单
- Qt5成功安装并可在CMake中找到
- QGIS库成功链接
- Fast DDS库成功链接
- 项目成功编译(无错误)
- 可执行文件为ARM64架构
- 所有依赖库都能正确加载
- 程序可以正常启动
- 地图显示功能正常
- DDS通信功能正常
- 界面显示正常(字体、图标等)
- 性能满足要求
附录
A. 环境变量汇总
bash
# Qt5
export Qt5_DIR=/usr/lib/aarch64-linux-gnu/cmake/Qt5
export QT_PLUGIN_PATH=/usr/lib/aarch64-linux-gnu/qt5/plugins
# QGIS
export QGIS_PREFIX_PATH=/usr
export QGIS_PLUGINPATH=/usr/lib/qgis/plugins
export PROJ_LIB=/usr/share/proj
export GDAL_DATA=/usr/share/gdal
# Fast DDS
export FASTRTPSHOME=/usr/local
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
# 字体
export QT_QPA_FONTDIR=/usr/share/fonts
B. 常用命令
bash
# 查看系统架构
uname -m # 应显示: aarch64
# 查看Qt版本
qmake --version
# 查看QGIS版本
qgis --version
# 查看已安装的包
dpkg -l | grep -E "qt5|qgis|fast"
# 清理构建
rm -rf build-ft-d3000
# 重新构建
./build_ft_d3000.sh
C. 参考资源
Group
1062801117