SDK 系列 -- 下载器 -- 前置工作

一、背景

桌面客户端开发会涉及到文件更新:大文件的局部更新。通常情况下,我们可以使用了 Aria2c 作为辅助下载工具(非 libaria)。文件局部更新的需求,实现主流的更新下载方案很重要。

二、现状

自研下载器是采用 Golang 语言开发,并以库的形式供平台集成。开发前期存在以下问题:

  • Golang 只能提供 Windows 平台的动态链接库,且缺少 *.lib 符号文件
  • 自研库的开发同学资历尚浅,且库未作 Windows 平台下的功能性验证

因此,要作一些准备工作以提高开发效率:

  • lib 生成工具:以应对 SDK 接入前期频繁更换库文件的情况
  • C++ 测试环境:以用于 SDK 接入前期的频繁验证工作

三、解决方案

本节内容将以列表形式提供: lib 工具生成、VSCode 测试环境

1、lib 生成(手动)

动态库的使用方式分为:动态调用,静态调用。SDK 导出库只给到了 *.h 和 *.dll 文件。要想以静态调用的方式使用,我们需要通过 *.dll 生成对应的 *.lib 符号文件。大致步骤如下:

  • 导出 dump.txt
    使用 Developer Command Prompt for VS 20XX 工具,通过命令行 dumpbin /EXPORTS *.dll > dump.txt 导出:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Dump of file 7z.dll

    File Type: DLL

    Section contains the following exports for 7z.dll

    00000000 characteristics
    62D16FC1 time date stamp Fri Jul 15 21:46:41 2022
    0.00 version
    1 ordinal base
    13 number of functions
    13 number of names

    ordinal hint RVA name
    1 0 0010D6E0 CreateDecoder
    .
    Summary
    9000 .data 13000 .pdata 55000 .rdata 4000 .reloc 19000 .rsrc 137000 .text
    导出信息相当丰富,但我们只需要 Section 段落中的导出函数名, 比如:CreateDecoder 等…
  • 生成 .def
    DEF 文件格式详见官方介绍。本着最简原则,我们只需要用到:LIBRARY、EXPORTS。为了简化操作步骤,我们需要一个辅助工具: 根据 dump 信息生成 .def 文件 (导出接口变化时,才需要重新导出 DEF) 。辅助工具逻辑大致如下:
    • 读取 dump 文件: dump.txt
    • 定位 Section 段落:
      • begin with: original hint RVA
      • end with: Summary
    • 搜索符号并写入 .DEF 文件
  • 生成 .lib
    使用 Developer Command Prompt for VS 工具,通过命令行: lib /def:example.def /machine:x64 /out:example.lib

2、lib 生成工具

现成的开源工具 IMPLIB,可以根据 DLL 文件或者 DEF 文件生成对应的导出文件 LIB。使用教程可参考官方文件,大致命令如下:

1
implib [switches] libfile [ dllfile | deffile ]

3、测试环境搭建:VSCode with C++

当 DLL 接口更新时,涉及到的工作流大致如下:

  • 测试环境:快速生成 EXE、快速步进 DEBUG。
  • 测试链路: 生成 .lib –> 生成 EXE –> DEBUG。

VSCode 谁用谁知道,开发利器。因此,博主就将 VSCode 作为我们的测试环境。 关于 VSCode C++ 环境的搭建,网上教程一大把。因此,博主只对一些必要的配置做介绍。

  • mingw64: 提供 Windows 下软件构建所需的工具,如:gcc, g++ 等
  • launch.json: vscode 启动程序的配置文件
    • program: EXE 的全路径
    • miDebuggerPath: GDB 的全路径
    • preLaunchTask: EXE 运行的前置工作,如:编译工作。
  • task.json: 协助 launch.json 的前置工作
    • label: 任务提示词,执行构建时供用户选用的提示
    • command: 执行命令
    • args: 构建参数,比如:源文件、包含路径、依赖路径等

SDK 系列 -- 下载器 -- 前置工作
https://jalencui.com/2023/09/15/SDK-Downloader-part1/
Author
Jalen Cui
Posted on
September 15, 2023
Licensed under