首页 / 资讯中心 / 文章详情

stlink 从源码编译完整指南:Windows MSVC、Linux 与交叉构建实战

stlink 从源码编译完整指南:Windows MSVC、Linux 与交叉构建实战 ★ FEATURED ARTICLE
嵌入式硬件开发开发工具调试器【免费下载链接】stlinkOpen source STM32 MCU programming toolset项目地址https://gitcode.com/gh_mirrors/st/stlink点击查看免费下载本文是 stlinkOpen source STM32 MCU programming toolset开源 STM32 编程/烧录工具集的源码编译实战指南覆盖 WindowsMSVC、Linux 两大平台的标准构建流程、Windows 交叉编译、udev 设备权限配置与构建选项调优。读完本文你将能够在 Windows 与 Linux 上独立完成st-flash、st-info、st-util、st-trace、st-server等工具的编译、安装、打包与卸载并理解其 CMake 构建系统的内部工作原理。一、编译前概览工具链与依赖stlink 采用 CMake 作为底层构建系统并在项目根目录提供了一层 Makefile 封装来驱动常见构建目标。无论哪个平台核心依赖都是libusb-1.0USB 通信层与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-sharedlibstlink.so/stlink.dll与静态库stlink-staticCMakeLists.txt。二、Microsoft Windows - MSVC 编译2.1 环境要求在 Windows 上官方文档要求预先安装以下软件软件说明git用于在缺失时构建 LibUSBcmake构建系统官方建议使用 Windows x64 Installer 二进制发行版并务必把 cmake 加入系统PATHMSVC编译器官方在 Visual Studio 2022 与 Build Tools for Visual Studio 2022 上验证通过2.2 安装步骤安装Build Tools for Visual Studio包含 MSVC 编译器。安装CMake Windows x64 Installer安装向导中勾选将 cmake 加入系统 PATH。获取源码在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_TYPERelease cmake --build . --target ALL_BUILD cmake --build . --target INSTALLcmake -G Visual Studio 17 2022指定生成器为 Visual Studio 2022 解决方案ALL_BUILD是 VS 生成器下的总构建目标INSTALL目标会把产物安装到默认前缀C:\Program Files (x86)\stlink。安装完成后需要把C:\Program Files (x86)\stlink\bin加入PATH运行SystemPropertiesAdvanced.exe点击Environment Variables按钮在System Variables列表中找到并选中Path变量点击Edit..按钮在新窗口点击New输入安装路径的bin目录C:\Program Files (x86)\stlink\bin依次点击三个窗口的OK保存修改。注意事项使用 ST-LINK 编程器前需要安装 ST-LINK 驱动STSW-LINK009否则 Windows 无法正确枚举 USB 设备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_WINNT0x0A00即最低支持Windows 10链接ws2_32Windows Socket 库并引入 src/win32 目录下的平台替代实现win32_socket.c、mmap.c、sys_time.c、unistd.h以及getopt.cst-util/st-trace/st-server 在 Windows 下需要自行提供 getopt由于不使用__declspec(dllexport)共享库显式开启了WINDOWS_EXPORT_ALL_SYMBOLS以保证 MSVC 下导出全部符号CMakeLists.txt。三、Linux 编译3.1 依赖包从软件源安装以下软件包gitgcc与g或clangC 编译器make构建工具build-essential推荐Debian 系发行版内含gcc、g、libc6-dev、makecmakelibusb-1.0-0与libusb-1.0-0-devlibusb 及开发头文件必装libgtk-3-dev可选构建stlink-gui图形界面需要rpmDebian 系发行版上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/stlink3.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_TYPERelease后make对应build/Release目录Makefilemake debug在build/Debug中执行cmake -DCMAKE_BUILD_TYPEDebug后make对应build/Debug目录Makefilemake 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.txtmake 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/debRPM 的 changelog 取自 cmake/packaging/rpm/changelogDEB 依赖声明为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-w64autotools-devlibtool按前述步骤完成源码获取后在项目根目录执行sudo sh ./gen_binaries_win.sh生成的 zip 包位于./build/dist即build/Release/dist。脚本内部会做两轮构建gen_binaries_win.shx86_64在build-mingw-64目录中以-DTOOLCHAIN_PREFIXx86_64-w64-mingw32调用工具链文件cmake/modules/set_toolchain.cmake并追加-DCMAKE_C_FLAGS-D_WIN32 -D_AMD64_、关闭 GUI-DSTLINK_GENERATE_GUIOFF执行make package后将 zip 复制到build/Release/disti68632 位同样的流程前缀换为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_WINNT0x0A00Windows 10编译选项。五、设备访问权限与 udev 规则Linux 发行版默认不允许普通用户直接访问 USB 设备。stlink 通过udev 规则创建设备节点使工具无需 root 权限即可运行。5.1 前提条件需要保证系统存在plugdev组且访问设备的用户是该组成员。5.2 规则文件位置与自动安装规则文件位于源码目录 config/udev/rules.d包括49-stlinkv1.rulesST-LINK/V1STM32VL 板载USB ID0483:374449-stlinkv2.rulesST-LINK/V2USB ID0483:3748如 STM32L、STM32F4 开发板49-stlinkv2-1.rulesST-LINK/V2.149-stlinkv3.rulesST-LINK/V3 全系列V3SET 多种模式、V3PWR 等。执行sudo make install时这些规则会由 CMake 自动安装到/lib/udev/rules.d/见 CMakeLists.txt安装路径硬编码为/lib/udev/rules.dmodprobe 配置则安装到/etc/modprobe.d。以 49-stlinkv2.rules 为例规则内容为SUBSYSTEMSusb, ATTRS{idVendor}0483, ATTRS{idProduct}3748, \ MODE:0666, \ SYMLINKstlinkv2_%n即匹配 USB 子系统下厂商 ID0483STMicroelectronics、产品 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_XXXX为内核分配的设备序号。六、ST-LINK/V1 编程器legacy特殊说明ST-LINK/V1 的 SCSI 模拟存在缺陷官方建议让操作系统完全忽略其 USB 存储功能。请在连接设备之前从以下方案中选择一种方案一临时禁用modprobe -r usb-storage modprobe usb-storage quirks483:3744:i方案二持久化写入 modprobe 配置echo options usb-storage quirks483: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 quirks483:3744:i其中483是 STMicroelectronics 的 USB 厂商 ID3744是 ST-LINK/V1 的产品 IDi表示对该设备忽略ignoreSCSI 相关处理。该文件在 Linux 构建安装时会被一并复制到/etc/modprobe.d/CMakeLists.txt。七、构建选项Build Options7.1 自定义共享库安装目录若想把编译好的共享库安装到非默认目录可指定 CMake 选项cmake -DLIB_INSTALL_DIR:PATH/usr/lib64 ..7.2 标准安装目录构建系统引入了GNUInstallDirsinclude(GNUInstallDirs)见 CMakeLists.txt遵循 GNU 编码标准定义的标准安装目录变量。默认情况下未重定义时生效的预设选项为-DCMAKE_INSTALL_SYSCONFDIR/etc-DCMAKE_INSTALL_PREFIX/usr/localGNUInstallDirs提供的目录变量与内置默认值对应关系如下取自 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到binCMakeLists.txt共享库/静态库到lib头文件到include/stlink非 Windows 平台见 CMakeLists.txtMCU 芯片配置文件config/chips 下的.chip文件到${CMAKE_INSTALL_FULL_DATADIR}/stlink/config/chips编译期通过-DSTLINK_CHIPS_DIR...注入CMakeLists.txtudev 规则与 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_SOURCE2、-fstrict-aliasing等Debug 构建追加-ggdbRelease 构建追加-Werror把警告升级为错误OpenBSD 因系统头文件问题跳过-Wredundant-decls。此外还检测sys/mman.h、sys/time.h、unistd.h、dirent.h的存在性并定义相应宏Stack Smashing ProtectionSSP库若存在也会自动链接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-devLinux或对应 Windows 依赖Linux 下工具提示无法打开 USB 设备确认用户属于plugdev组、udev 规则已安装并重载见第五节ST-LINK/V1 设备被识别为 U 盘按第六节配置usb-storage的quirks483:3744:imake 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 目录下的其他文档。赞分享嵌入式硬件开发开发工具调试器【免费下载链接】stlinkOpen source STM32 MCU programming toolset项目地址https://gitcode.com/gh_mirrors/st/stlink点击查看免费下载相关推荐douyin-downloader 实战指南抖音无水印批量下载完整教程douyin downloader 实战指南抖音无水印批量下载完整教程 douyin downloader 是一套面向抖音无水印下载的开源免费命令行工具粘一网页爬虫CLIUnicorn 引擎从源码构建完全指南CMake 原生编译与 Linux/Windows/Android 交叉编译实战Unicorn 引擎从源码构建完全指南CMake 原生编译与 Linux/Windows/Android 交叉编译实战 Unicorn 是一个基于 QEMU虚拟化逆向工程stlink 交叉编译指南在 Linux 上构建 Windows 版本的终极教程stlink 交叉编译指南在 Linux 上构建 Windows 版本的终极教程 stlink 是 STMicroelectronics 官方推出的调试和编程嵌入式硬件开发开发工具调试器上一篇demo-ai-app快速入门5分钟构建AI驱动的电影搜索应用下一篇Glance GUI界面开发使用GTK构建可视化Haskell编辑器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站