源码编译与开发环境搭建

第十二章 源码编译与开发环境搭建

12.1 开发环境概述

12.1.1 开发工具选择

LibreCAD支持多种开发环境:

环境 平台 推荐度
Qt Creator 全平台 ★★★★★
Visual Studio + Qt插件 Windows ★★★★☆
CLion 全平台 ★★★☆☆
VSCode + CMake 全平台 ★★★☆☆

12.1.2 依赖库

依赖 最低版本 说明
Qt 6.4.0 GUI框架(2.2.2分支)
Boost 1.55.0 C++工具库
muParser 2.3.0 数学表达式解析
libdxfrw - DXF/DWG文件读写

12.1.3 构建系统

LibreCAD支持两种构建系统:

CMake(推荐):

  • 现代化的构建系统
  • 更好的IDE集成
  • 跨平台支持

qmake

  • Qt原生构建工具
  • 传统方式
  • 简单项目适用

12.2 Windows环境搭建

12.2.1 安装Qt

使用Qt在线安装器

  1. 下载Qt Online Installer:https://www.qt.io/download-open-source
  2. 运行安装程序
  3. 选择组件:
    • Qt 6.x.x(最新稳定版)
      • MinGW x64
      • Qt 5 Compatibility Module
      • Qt Shader Tools
    • Developer and Designer Tools
      • CMake
      • Ninja
      • MinGW x64

安装路径
建议安装到 C:\Qt

12.2.2 安装Boost

方法一:预编译包

  1. 下载预编译的Boost库
  2. 解压到 C:\local\boost_1_85_0

方法二:从源码编译

# 下载Boost源码
# 解压后进入目录

# 运行bootstrap
.\bootstrap.bat

# 编译(MinGW)
.\b2 toolset=gcc --build-type=complete --prefix=C:\Boost install

12.2.3 获取源码

# 克隆仓库
git clone https://github.com/LibreCAD/LibreCAD.git

# 初始化子模块
cd LibreCAD
git submodule update --init --recursive

# 切换到稳定分支
git checkout 2.2.2

12.2.4 使用Qt Creator编译

打开项目

  1. 打开Qt Creator
  2. 文件 > 打开文件或项目
  3. 选择 CMakeLists.txtlibrecad.pro

配置CMake(如使用CMake):

  1. 选择构建套件(MinGW 64-bit)
  2. 配置CMake变量:
    BOOST_ROOT=C:/local/boost_1_85_0
    
  3. 运行CMake

编译

  • 点击"构建" > "构建项目"
  • 或按 Ctrl+B

12.2.5 使用Visual Studio编译

安装VS和Qt VS Tools

  1. 安装Visual Studio 2022
  2. 安装Qt VS Tools扩展
  3. 在VS中配置Qt版本

打开项目

  1. 使用CMake生成VS解决方案:
    mkdir build
    cd build
    cmake -G "Visual Studio 17 2022" -A x64 ..
    
  2. 打开生成的.sln文件

设置环境变量

set BOOST_ROOT=C:\local\boost_1_85_0
set BOOST_LIBRARYDIR=C:\local\boost_1_85_0\lib64-msvc-14.3
set QTDIR=C:\Qt\6.x.x\msvc2022_64

12.2.6 常见编译问题

问题1:找不到Qt

解决:设置CMAKE_PREFIX_PATH或QTDIR环境变量
cmake -DCMAKE_PREFIX_PATH=C:/Qt/6.6.0/mingw_64 ..

问题2:Boost链接错误

解决:确保Boost版本与编译器匹配
设置BOOST_ROOT和BOOST_LIBRARYDIR

问题3:编码问题

解决:确保源文件使用UTF-8编码
在CMake中添加:add_compile_options(/utf-8)

12.3 Linux环境搭建

12.3.1 Ubuntu/Debian

安装依赖

# 更新包列表
sudo apt update

# 安装编译工具
sudo apt install build-essential cmake git

# 安装Qt6开发库
sudo apt install qt6-base-dev qt6-tools-dev libqt6svg6-dev \
                 qt6-l10n-tools libqt6core5compat6-dev

# 安装Boost
sudo apt install libboost-dev

# 安装muParser(可选,项目自带)
sudo apt install libmuparser-dev

12.3.2 Fedora/RHEL

# 安装编译工具
sudo dnf groupinstall "Development Tools"
sudo dnf install cmake git

# 安装Qt6
sudo dnf install qt6-qtbase-devel qt6-qtsvg-devel \
                 qt6-qttools-devel qt6-qt5compat-devel

# 安装Boost
sudo dnf install boost-devel

12.3.3 Arch Linux

# 安装依赖
sudo pacman -S base-devel cmake git qt6-base qt6-svg \
               qt6-tools qt6-5compat boost

12.3.4 获取和编译源码

# 克隆仓库
git clone https://github.com/LibreCAD/LibreCAD.git
cd LibreCAD
git submodule update --init --recursive

# 使用CMake编译
mkdir build && cd build
cmake ..
make -j$(nproc)

# 或使用qmake编译
qmake ../librecad.pro
make -j$(nproc)

12.3.5 运行

# 进入输出目录
cd unix

# 运行LibreCAD
./librecad

12.4 macOS环境搭建

12.4.1 安装Homebrew

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

12.4.2 安装依赖

# 安装编译工具
brew install cmake git

# 安装Qt6
brew install qt@6

# 安装Boost
brew install boost

# 设置Qt路径
export PATH="/opt/homebrew/opt/qt@6/bin:$PATH"
export LDFLAGS="-L/opt/homebrew/opt/qt@6/lib"
export CPPFLAGS="-I/opt/homebrew/opt/qt@6/include"
export PKG_CONFIG_PATH="/opt/homebrew/opt/qt@6/lib/pkgconfig"

12.4.3 编译

# 克隆并进入目录
git clone https://github.com/LibreCAD/LibreCAD.git
cd LibreCAD
git submodule update --init --recursive

# CMake编译
mkdir build && cd build
cmake -DCMAKE_PREFIX_PATH=/opt/homebrew/opt/qt@6 ..
make -j$(sysctl -n hw.ncpu)

# 或qmake编译
qmake ../librecad.pro
make -j$(sysctl -n hw.ncpu)

12.4.4 创建App Bundle

# 部署依赖
macdeployqt LibreCAD.app

# 签名(可选)
codesign --force --deep --sign - LibreCAD.app

12.5 CMake构建详解

12.5.1 CMakeLists.txt结构

cmake_minimum_required(VERSION 3.16)
project(LibreCAD)

# 设置C++标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 查找Qt
find_package(Qt6 REQUIRED COMPONENTS 
    Core Gui Widgets Svg PrintSupport)

# 查找Boost
find_package(Boost REQUIRED)

# 添加源文件
add_executable(librecad
    ${SOURCES}
    ${HEADERS}
    ${UI_FILES}
    ${RESOURCES}
)

# 链接库
target_link_libraries(librecad
    Qt6::Core
    Qt6::Gui
    Qt6::Widgets
    Qt6::Svg
    Qt6::PrintSupport
    Boost::boost
)

12.5.2 常用CMake变量

# 设置构建类型
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake -DCMAKE_BUILD_TYPE=Debug ..

# 设置Qt路径
cmake -DCMAKE_PREFIX_PATH=/path/to/qt ..

# 设置Boost路径
cmake -DBOOST_ROOT=/path/to/boost ..

# 启用测试
cmake -DBUILD_TESTS=ON ..

# 设置安装路径
cmake -DCMAKE_INSTALL_PREFIX=/usr/local ..

12.5.3 构建类型

类型 说明 用途
Debug 调试符号,无优化 开发调试
Release 完全优化 发布版本
RelWithDebInfo 优化+调试符号 性能分析
MinSizeRel 最小体积优化 嵌入式

12.6 项目结构

12.6.1 目录结构

LibreCAD/
├── CMakeLists.txt          # CMake主配置
├── librecad.pro            # qmake配置
├── librecad/
│   ├── src/
│   │   ├── main/           # 程序入口
│   │   ├── lib/            # 核心库
│   │   │   ├── engine/     # 图形引擎
│   │   │   ├── gui/        # GUI组件
│   │   │   ├── actions/    # 动作基类
│   │   │   ├── creation/   # 创建操作
│   │   │   ├── modification/# 修改操作
│   │   │   ├── information/# 信息查询
│   │   │   ├── math/       # 数学库
│   │   │   ├── filters/    # 文件过滤器
│   │   │   ├── fileio/     # 文件I/O
│   │   │   └── printing/   # 打印
│   │   ├── actions/        # 具体动作
│   │   ├── ui/             # UI文件
│   │   ├── cmd/            # 命令处理
│   │   └── plugins/        # 插件接口
│   ├── res/                # 资源文件
│   ├── ts/                 # 翻译文件
│   └── support/            # 支持文件
├── plugins/                # 官方插件
├── libraries/              # 库文件
├── externals/              # 外部依赖
└── tools/                  # 工具脚本

12.6.2 核心源文件

入口文件

  • librecad/src/main/main.cpp:程序入口

核心类文件

  • lib/engine/rs_entity.cpp:实体基类
  • lib/engine/rs_graphic.cpp:图形文档
  • lib/gui/rs_graphicview.cpp:图形视图
  • lib/actions/rs_actioninterface.cpp:动作接口

UI文件

  • ui/qc_applicationwindow.cpp:主窗口

12.7 调试技巧

12.7.1 Qt Creator调试

设置断点

  • 点击行号左侧添加断点
  • 条件断点:右键断点 > 编辑

变量监视

  • 局部变量窗口
  • 添加自定义表达式

调用栈

  • 查看函数调用链
  • 跳转到调用位置

12.7.2 GDB调试

# 编译Debug版本
cmake -DCMAKE_BUILD_TYPE=Debug ..
make

# 启动GDB
gdb ./librecad

# 常用命令
(gdb) break RS_ActionDrawLine::mouseReleaseEvent
(gdb) run
(gdb) next
(gdb) step
(gdb) print variable
(gdb) backtrace
(gdb) continue

12.7.3 日志输出

// 使用Qt日志系统
qDebug() << "Debug message";
qInfo() << "Info message";
qWarning() << "Warning message";
qCritical() << "Critical error";

// LibreCAD调试输出
RS_DEBUG->print("Debug: %s", message);
RS_DEBUG->print(RS_Debug::D_ERROR, "Error: %s", message);

12.7.4 内存调试

# 使用Valgrind(Linux)
valgrind --leak-check=full ./librecad

# 使用AddressSanitizer
cmake -DCMAKE_CXX_FLAGS="-fsanitize=address" ..

12.8 单元测试

12.8.1 启用测试

# CMake配置时启用测试
cmake -DBUILD_TESTS=ON ..
make

12.8.2 运行测试

# 运行所有测试
./build/librecad_tests

# 或使用CTest
cd build
ctest --output-on-failure

12.8.3 测试框架

LibreCAD使用Qt Test框架:

#include <QtTest/QtTest>

class TestRSMath : public QObject {
    Q_OBJECT

private slots:
    void testAngleNormalize();
    void testAngleDifference();
    void testVectorOperations();
};

void TestRSMath::testAngleNormalize() {
    QCOMPARE(RS_Math::correctAngle(2*M_PI + 0.1), 0.1);
    QCOMPARE(RS_Math::correctAngle(-0.1), 2*M_PI - 0.1);
}

QTEST_MAIN(TestRSMath)
#include "test_rs_math.moc"

12.9 开发工作流

12.9.1 Git工作流

# 创建功能分支
git checkout -b feature/my-feature

# 开发和提交
git add .
git commit -m "Add new feature"

# 同步上游更改
git fetch origin
git rebase origin/master

# 推送分支
git push origin feature/my-feature

# 创建Pull Request

12.9.2 代码风格

LibreCAD使用特定的代码风格,可用astyle格式化:

# 使用项目的astyle配置
astyle --options=librecad.astylerc src/*.cpp

主要规范

  • 缩进:4个空格
  • 括号:Allman风格
  • 命名:驼峰命名法

12.9.3 提交规范

类型: 简短描述

详细描述...

类型包括:
- feat: 新功能
- fix: 修复Bug
- docs: 文档更新
- style: 代码格式
- refactor: 重构
- test: 测试
- chore: 构建/工具

12.10 本章小结

本章介绍了LibreCAD的源码编译和开发环境搭建:

  1. 开发环境:工具选择、依赖库、构建系统
  2. Windows环境:Qt安装、Boost安装、VS/Qt Creator配置
  3. Linux环境:包管理器安装依赖、编译步骤
  4. macOS环境:Homebrew安装、编译配置
  5. CMake构建:配置选项、构建类型
  6. 项目结构:目录组织、核心文件
  7. 调试技巧:Qt Creator调试、GDB、日志
  8. 单元测试:启用和运行测试
  9. 开发工作流:Git工作流、代码风格

掌握开发环境搭建是进行LibreCAD二次开发的第一步。


上一章:核心架构解析 | 下一章:实体系统详解


posted @ 2026-01-10 13:13  我才是银古  阅读(21)  评论(0)    收藏  举报