☰
stlink 从源码编译完整指南:Windows MSVC、Linux 与交叉构建实战
2026/10/4 1:54:15 网站建设 项目流程
  • 嵌入式
  • 硬件开发
  • 开发工具
  • 调试器

【免费下载链接】stlink

Open source STM32 MCU programming toolset

项目地址:https://gitcode.com/gh_mirrors/st/stlink
点击查看免费下载

本文是 stlink(Open source STM32 MCU programming toolset,开源 STM32 编程/烧录工具集)的源码编译实战指南,覆盖 Windows(MSVC)、Linux 两大平台的标准构建流程、Windows 交叉编译、udev 设备权限配置与构建选项调优。读完本文,你将能够在 Windows 与 Linux 上独立完成st-flash、st-info、st-util、st-trace、st-server等工具的编译、安装、打包与卸载,并理解其 CMake 构建系统的内部工作原理。

一、编译前概览:工具链与依赖

stlink 采用 CMake 作为底层构建系统,并在项目根目录提供了一层 Makefile 封装来驱动常见构建目标。无论哪个平台,核心依赖都是libusb-1.0(USB 通信层)与C 编译器。顶层 CMakeLists.txt 中可以看到:

  • 项目要求cmake_minimum_required(VERSION 3.20),采用 C17 标准(set(CMAKE_C_STANDARD 17));
  • 通过find_package(libusb REQUIRED)强制要求 libusb 存在,找不到会直接报错;
  • 构建产物统一输出到build/bin(可执行文件)与build/lib(库文件);
  • 会同时构建共享库stlink-shared(libstlink.so/stlink.dll)与静态库stlink-static(CMakeLists.txt)。

二、Microsoft Windows - MSVC 编译

2.1 环境要求

在 Windows 上,官方文档要求预先安装以下软件:

软件说明
git用于在缺失时构建 LibUSB
cmake构建系统,官方建议使用 Windows x64 Installer 二进制发行版,并务必把 cmake 加入系统PATH
MSVC编译器官方在 Visual Studio 2022 与 Build Tools for Visual Studio 2022 上验证通过

2.2 安装步骤

  1. 安装Build Tools for Visual Studio(包含 MSVC 编译器)。

  2. 安装CMake Windows x64 Installer,安装向导中勾选"将 cmake 加入系统 PATH"。

  3. 获取源码:在cmd.exe/powershell.exe中执行

    git clone https://gitcode.com/gh_mirrors/st/stlink

    或者从 Release 页面下载最新.zip源码包并用 7-Zip 解压。

2.3 构建步骤

在管理员权限的命令行中依次执行:

cd C:\$Path-to-your-stlink-folder$ cd .\build cmake -G "Visual Studio 17 2022" .. -DCMAKE_BUILD_TYPE="Release" cmake --build . --target ALL_BUILD cmake --build . --target INSTALL
  • cmake -G "Visual Studio 17 2022"指定生成器为 Visual Studio 2022 解决方案;
  • ALL_BUILD是 VS 生成器下的总构建目标;
  • INSTALL目标会把产物安装到默认前缀C:\Program Files (x86)\stlink。

安装完成后,需要把C:\Program Files (x86)\stlink\bin加入PATH:

  1. 运行SystemPropertiesAdvanced.exe;
  2. 点击Environment Variables按钮;
  3. 在System Variables列表中找到并选中Path变量;
  4. 点击Edit..按钮;
  5. 在新窗口点击New;
  6. 输入安装路径的bin目录:C:\Program Files (x86)\stlink\bin;
  7. 依次点击三个窗口的OK保存修改。

注意事项:

  1. 使用 ST-LINK 编程器前,需要安装 ST-LINK 驱动(STSW-LINK009),否则 Windows 无法正确枚举 USB 设备;
  2. MSVC 下的包生成(CPack 打包)尚未实现/测试——即make package类的打包流程在 MSVC 平台暂不可用。

2.4 MSVC 构建的源码细节

从源码结构看,MSVC 构建做了若干针对性适配(CMakeLists.txt):

  • 覆盖 MSVC 的 C 编译标志为/MT系列(/MTd、/MT),并定义了_CRT_SECURE_NO_WARNINGS、_CRT_NONSTDC_NO_WARNINGS等宏以关闭烦人的 CRT 警告;
  • 强制-D_WIN32_WINNT=0x0A00,即最低支持Windows 10;
  • 链接ws2_32(Windows Socket 库),并引入 src/win32 目录下的平台替代实现:win32_socket.c、mmap.c、sys_time.c、unistd.h以及getopt.c(st-util/st-trace/st-server 在 Windows 下需要自行提供 getopt);
  • 由于不使用__declspec(dllexport),共享库显式开启了WINDOWS_EXPORT_ALL_SYMBOLS以保证 MSVC 下导出全部符号(CMakeLists.txt)。

三、Linux 编译

3.1 依赖包

从软件源安装以下软件包:

  • git
  • gcc与g++,或clang(C 编译器)
  • make(构建工具)
  • build-essential(推荐,Debian 系发行版,内含gcc、g++、libc6-dev、make)
  • cmake
  • libusb-1.0-0与libusb-1.0-0-dev(libusb 及开发头文件,必装)
  • libgtk-3-dev(可选,构建stlink-gui图形界面需要)
  • rpm(Debian 系发行版上,make package同时生成 RPM 包时需要)
  • pandoc(可选,从 Markdown 生成 man 手册页需要)

其中 GUI 的可选性在源码中得到了印证:src/stlink-gui/CMakeLists.txt通过pkg_check_modules(GTK3 QUIET gtk+-3.0)检测 GTK3,若未找到则打印GTK3 not found! GUI build will be skipped.并直接跳过 GUI 构建(src/stlink-gui/CMakeLists.txt)。

3.2 获取源码

mkdir $HOME/git cd ~/git git clone https://gitcode.com/gh_mirrors/st/stlink

3.3 编译、安装与打包

进入源码目录后,通过顶层 Makefile 提供的目标进行构建:

cd stlink make clean # 部分 Linux 发行版需要先清理 make release # 创建 Release 目标 sudo make install # 完整安装并做系统级集成(可能需要 sudo) make debug # (可选)创建 Debug 目标,用于修改源码后在调试器下运行 make package # 构建 Debian 包,产物位于 ./build/Release/dist

安装完成后,如果执行的是系统级安装(sudo make install),需要更新动态库缓存:

sudo ldconfig

可选:安装到自定义目录

make install DESTDIR=$HOME

可将安装重定向到用户自定义目录(如$HOME)。

卸载与清理:

make uninstall # 干净地卸载已安装的包 make clean # 清理项目源码中的 build 目录,删除所有编译/链接产物

3.4 Makefile 目标的源码级解读

顶层 Makefile 实际是 CMake 目标的驱动封装(MAKEFLAGS += -s静默模式),关键映射如下:

Make 目标实际执行说明
make release在build/Release中执行cmake -DCMAKE_BUILD_TYPE=Release后make对应build/Release目录(Makefile)
make debug在build/Debug中执行cmake -DCMAKE_BUILD_TYPE=Debug后make对应build/Debug目录(Makefile)
make install对build/Release执行make install安装 Release 产物
make uninstall对build/Release执行make uninstall卸载
make package对build/Release执行make package走 CPack 生成发行包
make test先构建 Debug 再执行 CTest仅在 Debug 构建中通过include(CTest)启用测试(CMakeLists.txt)
make clean删除整个build目录

如需向 CMake 追加参数(如自定义安装前缀),可修改 Makefile 顶部的CMAKEFLAGS变量,例如CMAKEFLAGS += -DCMAKE_INSTALL_PREFIX=$(HOME)/.local。

3.5 打包流程说明

make package依赖 CPack 配置 cmake/modules/cpack_config.cmake,其行为按平台分支:

  • Debian/Ubuntu 上:同时生成DEB与RPM两种包(RPM 需要系统装有rpm命令),DEB 包的额外控制文件(changelog、copyright、rules、postinst)取自 cmake/packaging/deb,RPM 的 changelog 取自 cmake/packaging/rpm/changelog,DEB 依赖声明为libusb-1.0-0-dev (>= 1.0.24)、cmake (>= 3.19)等;
  • Windows 原生:生成 ZIP 包,包名形如stlink-<版本>-win32;
  • 其他平台:不生成包。

四、交叉构建 Windows 版本(Linux 主机)

在 Linux 上可以用 MinGW 交叉编译出 Windows 二进制,官方提供了自动化脚本 gen_binaries_win.sh。

首先安装交叉工具链:

  • mingw-w64
  • autotools-dev
  • libtool

按前述步骤完成源码获取后,在项目根目录执行:

sudo sh ./gen_binaries_win.sh

生成的 zip 包位于./build/dist(即build/Release/dist)。

脚本内部会做两轮构建(gen_binaries_win.sh):

  1. x86_64:在build-mingw-64目录中,以-DTOOLCHAIN_PREFIX=x86_64-w64-mingw32调用工具链文件cmake/modules/set_toolchain.cmake,并追加-DCMAKE_C_FLAGS="-D_WIN32 -D_AMD64_"、关闭 GUI(-DSTLINK_GENERATE_GUI=OFF),执行make package后将 zip 复制到build/Release/dist;
  2. i686(32 位):同样的流程,前缀换为i686-w64-mingw32。

工具链文件 cmake/modules/set_toolchain.cmake 的核心内容:

  • 指定交叉编译器:${TOOLCHAIN_PREFIX}-gcc、-g++、-windres;
  • 设置CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX},且CMAKE_FIND_ROOT_PATH_MODE_LIBRARY/INCLUDE ONLY(只在目标环境中找库和头文件),PROGRAM NEVER(程序仍在主机环境找);
  • 声明CMAKE_SYSTEM_NAME Windows,并添加-DWIN32_LEAN_AND_MEAN、-D_WIN32_WINNT=0x0A00(Windows 10+)编译选项。

五、设备访问权限与 udev 规则

Linux 发行版默认不允许普通用户直接访问 USB 设备。stlink 通过udev 规则创建设备节点,使工具无需 root 权限即可运行。

5.1 前提条件

需要保证系统存在plugdev组,且访问设备的用户是该组成员。

5.2 规则文件位置与自动安装

规则文件位于源码目录 config/udev/rules.d,包括:

  • 49-stlinkv1.rules:ST-LINK/V1(STM32VL 板载,USB ID0483:3744);
  • 49-stlinkv2.rules:ST-LINK/V2(USB ID0483:3748,如 STM32L、STM32F4 开发板);
  • 49-stlinkv2-1.rules:ST-LINK/V2.1;
  • 49-stlinkv3.rules:ST-LINK/V3 全系列(V3SET 多种模式、V3PWR 等)。

执行sudo make install时,这些规则会由 CMake 自动安装到/lib/udev/rules.d/(见 CMakeLists.txt,安装路径硬编码为/lib/udev/rules.d,modprobe 配置则安装到/etc/modprobe.d)。

以 49-stlinkv2.rules 为例,规则内容为:

SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", \ MODE:="0666", \ SYMLINK+="stlinkv2_%n"

即:匹配 USB 子系统下厂商 ID0483(STMicroelectronics)、产品 ID3748的设备,赋予读写权限0666,并创建符号链接stlinkv2_%n。

5.3 手动安装与重载

如果跳过make install,可手动复制并重载规则:

sudo cp -a config/udev/rules.d/* /lib/udev/rules.d/ sudo udevadm control --reload-rules sudo udevadm trigger

之后 udev 会创建设备节点文件,例如/dev/stlinkv3_XX、/dev/stlinkv2_XX、/dev/stlinkv1_XX(XX为内核分配的设备序号)。

六、ST-LINK/V1 编程器(legacy)特殊说明

ST-LINK/V1 的 SCSI 模拟存在缺陷,官方建议让操作系统完全忽略其 USB 存储功能。请在连接设备之前从以下方案中选择一种:

方案一(临时禁用):

modprobe -r usb-storage && modprobe usb-storage quirks=483:3744:i

方案二(持久化,写入 modprobe 配置):

echo "options usb-storage quirks=483:3744:i" >> /etc/modprobe.conf modprobe -r usb-storage && modprobe usb-storage

方案三(使用仓库提供的配置文件):

cp stlink_v1.modprobe.conf /etc/modprobe.d modprobe -r usb-storage && modprobe usb-storage

仓库中对应的现成配置文件是 config/modprobe.d/stlink_v1.conf,其内容正是:

options usb-storage quirks=483:3744:i

其中483是 STMicroelectronics 的 USB 厂商 ID,3744是 ST-LINK/V1 的产品 ID,i表示对该设备忽略(ignore)SCSI 相关处理。该文件在 Linux 构建安装时会被一并复制到/etc/modprobe.d/(CMakeLists.txt)。

七、构建选项(Build Options)

7.1 自定义共享库安装目录

若想把编译好的共享库安装到非默认目录,可指定 CMake 选项:

cmake -DLIB_INSTALL_DIR:PATH="/usr/lib64" ..

7.2 标准安装目录

构建系统引入了GNUInstallDirs(include(GNUInstallDirs),见 CMakeLists.txt),遵循 GNU 编码标准定义的标准安装目录变量。默认情况下(未重定义时)生效的预设选项为:

  • -DCMAKE_INSTALL_SYSCONFDIR=/etc
  • -DCMAKE_INSTALL_PREFIX=/usr/local

GNUInstallDirs提供的目录变量与内置默认值对应关系如下(取自 CMakeLists.txt 的注释说明):

安装类型变量内置默认值
可执行文件(RUNTIME)${CMAKE_INSTALL_BINDIR}bin
共享库(LIBRARY)${CMAKE_INSTALL_LIBDIR}lib
静态库(ARCHIVE)${CMAKE_INSTALL_LIBDIR}lib
头文件(PRIVATE/PUBLIC_HEADER、HEADERS)${CMAKE_INSTALL_INCLUDEDIR}include
系统配置(SYSCONF)${CMAKE_INSTALL_SYSCONFDIR}etc
本地状态(LOCALSTATE)${CMAKE_INSTALL_LOCALSTATEDIR}var
数据(DATA)${CMAKE_INSTALL_DATADIR}<DATAROOT dir>
手册(MAN)${CMAKE_INSTALL_MANDIR}<DATAROOT dir>/man
文档(DOC)${CMAKE_INSTALL_DOCDIR}<DATAROOT dir>/doc

实践中,stlink会安装:

  • 5 个 CLI 工具(st-flash、st-info、st-util、st-trace、st-server)到bin(CMakeLists.txt);
  • 共享库/静态库到lib;
  • 头文件到include/stlink(非 Windows 平台,见 CMakeLists.txt);
  • MCU 芯片配置文件(config/chips 下的.chip文件)到${CMAKE_INSTALL_FULL_DATADIR}/stlink/config/chips,编译期通过-DSTLINK_CHIPS_DIR=...注入(CMakeLists.txt);
  • udev 规则与 modprobe 配置到系统目录(Linux 限定);
  • man 手册页(st-info、st-flash、st-util、st-server的.1页,源文件在 doc/man)到${CMAKE_INSTALL_FULL_DATADIR}/man/man1。

八、构建系统的内部机制速览

8.1 版本号的自动检测

版本号由 cmake/modules/get_version.cmake 自动确定:

  • 若在 Git 仓库中(存在.git),执行git describe --always --tag获取版本;本地有未提交修改时追加-dirty后缀;并自动剥离版本号前的v前缀;
  • 若 Git 不可用或版本解析失败(例如从源码包构建),则回退读取源码根目录的.version文件,找不到时直接FATAL_ERROR终止;
  • 解析出的PROJECT_VERSION_MAJOR/MINOR/PATCH会通过模板 inc/version.h.in 生成inc/version.h(定义STLINK_VERSION等宏),编译时以${PROJECT_BINARY_DIR}/inc加入头文件搜索路径。

8.2 编译告警与安全标志

非 MSVC 平台通过 cmake/modules/c_flags.cmake 按"编译器是否支持"逐项追加标志,包括-Wall、-Wextra、-Wshadow、-Wformat、-Wformat-security、-D_FORTIFY_SOURCE=2、-fstrict-aliasing等;Debug 构建追加-ggdb,Release 构建追加-Werror(把警告升级为错误);OpenBSD 因系统头文件问题跳过-Wredundant-decls。此外还检测sys/mman.h、sys/time.h、unistd.h、dirent.h的存在性并定义相应宏,Stack Smashing Protection(SSP)库若存在也会自动链接(CMakeLists.txt)。

8.3 测试目标

Debug 构建会通过include(CTest)启用测试(CMakeLists.txt),测试源码位于 tests 目录(如flash.c、sg_legacy.c、usb.c等),可通过make test运行。

九、常见问题速查

现象排查方向
CMake 报find_package(libusb REQUIRED)失败确认已安装libusb-1.0-0-dev(Linux)或对应 Windows 依赖
Linux 下工具提示无法打开 USB 设备确认用户属于plugdev组、udev 规则已安装并重载(见第五节)
ST-LINK/V1 设备被识别为 U 盘按第六节配置usb-storage的quirks=483:3744:i
make package缺少 RPM 包Debian 系发行版需先安装rpm软件包
MSVC 下无法生成安装包官方说明 MSVC 的包生成尚未实现/测试,请改用ALL_BUILD/INSTALL目标
版本号异常(带-dirty)源码目录存在未提交的 Git 改动,属get_version.cmake的正常行为

说明:本文所有命令与配置均以当前仓库实际内容为准。若需了解各 CLI 工具的具体用法,可参阅 doc/man 下的 man 手册源文件(st-flash、st-info、st-util、st-server),或阅读 README.md 与 doc 目录下的其他文档。

  • 嵌入式
  • 硬件开发
  • 开发工具
  • 调试器

【免费下载链接】stlink

Open source STM32 MCU programming toolset

项目地址:https://gitcode.com/gh_mirrors/st/stlink
点击查看免费下载
上一篇:demo-ai-app快速入门:5分钟构建AI驱动的电影搜索应用
下一篇:Glance GUI界面开发:使用GTK构建可视化Haskell编辑器

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询