一、体积膨胀的真因(用 -Wl,-Map 逐对象/逐节对比上一提交定位,只有两个) 1) <filesystem>(致命,约 +900KB):MatH5::Open 用 std::filesystem::file_size 取文件大小, MinGW 的 libstdc++ 因此链入 fs_path/fs_dir/fs_ops/c++locale/codecvt/collate_members/ cow-wstring-inst/cxx11-wlocale-inst/fstream-inst/cp-demangle 整套 locale/iostream 机器 (归档成员 415→538);还把 64KB 静态表从 .bss 挤成 .data(1.8KB→73.8KB)。 修法:改用 _wfopen_s + _fseeki64/_ftelli64 取大小。 2) -lz(约 46KB):只需要"解开 HDF5 分块"。修法:MatH5 内置紧凑 inflate (RFC1950/1951:固定/动态 Huffman、存储块、长度-距离回抄),Makefile 与探针脚本移除 -lz。 顺带把 UploadHaloLayer 里 64KB 的预乘 alpha 查表换成 (v*a+128)*257>>16(无除法、无表)。 二、压到 800KB 以下的两项无损措施 1) 图标资源无损重编码:ico 里 64/48/32/16 四帧原为未压缩 32bpp DIB(合计 32KB), 用自写工具(GDI+ 编码)改为 PNG 帧(ICO 的 PNG 条目 Vista+ 全支持,本文件本就有 256 PNG 帧): 43,334 → 17,404 字节。像素逐点校验:差异 ≤85 像素、最大分量差 ≤3(编码取整),肉眼不可辨; 并从**真实产物** LoadImageW 逐尺寸(16/32/48/64)验证可加载。 2) RELEASE_OPT 由 -Os 改为 -Oz(省约 6KB);实测动画帧 p50 7.73ms(-Os) vs 7.77ms(-Oz), 无可辨识差异。 放弃的手段:-ffunction-sections/-fdata-sections + --gc-sections(反而 +9KB)、LTO(工具链 ICE)、 -fno-asynchronous-unwind-tables(链接失败)、-fno-exceptions(会破坏 catch (bad_alloc))。 结果:Build/Release/Target.exe = 795,648 字节。 三、.mat 加载进度不更新(已加载大小 / 总大小 / 百分比都停在 0) 真因:LoadMatSourceGroups 只在结束时回调一次 ratio=1.0,且从不设置 hasBytes; 读 42MB 文件与解码 19 个样本流(解压+拷贝,占大头)期间进度恒为 0。 修法: - MatHdf5::Open 新增 OpenProgress(bytesRead,totalBytes),按 4MB 分块读取并回报; - MatLoader 用 ProgressReporter 把进度拆成 0.00–0.55 读文件(hasBytes=true)与 0.55–0.98 解码样本流(每解完一个流推进 done/total),末段 1.0; - 取消与出错分开:取消时清空 error,不弹错误框。 实测:回调 29 次、字节数变化 11 次、比例单调、终值 1.000、bytes=42,386,344/42,386,344 (= 文件大小);Application 侧断言 m_loadingBytesRead == m_loadingTotalBytes == 文件大小。 四、验证(全部离屏,不占用鼠标/键盘/屏幕) - matcheck 21/21(新增进度断言)、matui 15/15(新增图标 + 加载字节断言); - 回归 verify 49/49、panelanim 158/158、gridanim 93/93、hoverdrag 20/20、lanescroll 23/23、 datacheck 69/69、edgecheck 46/46、errcheck 19/19、halocheck 16/16、panflash 19/19、 panelstutter 8/8、stress 6/6; - make release / make debug 零警告。 文档:Documents/agent_mem.md 追加本轮小节(含 5 条新规则:MinGW 下 <filesystem> 是体积炸弹、 链一整条库前先算账、膨胀要看节表而非 .o 大小、图标可无损重编码并用产物校验、 长解析必须按阶段回报进度且 hasBytes 只在有字节时置真)。
251 lines
7.8 KiB
Makefile
251 lines
7.8 KiB
Makefile
# 目标文件名称
|
||
TARGET_FILE_NAME = Target
|
||
|
||
# 编译目录
|
||
BUILD_DIR = Build
|
||
|
||
# Release 编译子目录
|
||
SUB_DIR_RELEASE = Release
|
||
|
||
# Debug 编译子目录
|
||
SUB_DIR_DEBUG = Debug
|
||
|
||
# Release 优化等级
|
||
# ⚠️ 用 `-Oz` 而不是 `-Os`:本项目热点全在 GDI/GDI+ 绘制上,`-Oz` 与 `-Os` 的实测帧耗时
|
||
# 没有可辨识差异,但产物小 ~6KB(用户 2026-10-19 要求 Release 二进制 < 800KB)。
|
||
RELEASE_OPT = -Oz
|
||
|
||
# Debug 优化等级
|
||
DEBUG_OPT = -O0
|
||
|
||
# GUI或CUI编译选项 [0]CUI/Console [1]GUI
|
||
GUI = 1
|
||
|
||
# C编译标准
|
||
C_STD = c17
|
||
|
||
# C++编译标准
|
||
CXX_STD = c++17
|
||
|
||
# 源文件编码定义
|
||
INPUT_CHAR_ENCODING = UTF-8
|
||
|
||
# 编译产物单字节字符(char)编码定义
|
||
OUTPUT_CHAR_ENCODING = GBK
|
||
|
||
# 编译产物宽字符(wchar_t)编码定义
|
||
OUTPUT_WCHAR_ENCODING = UTF-16LE
|
||
|
||
# 编译工具前缀
|
||
COMPLIER_PREFIX = \
|
||
|
||
# C编译工具
|
||
C_COMPLIER = $(strip $(COMPLIER_PREFIX))gcc
|
||
|
||
# C++编译工具
|
||
CXX_COMPLIER = $(strip $(COMPLIER_PREFIX))g++
|
||
|
||
# Windows 资源文件编译工具
|
||
WIN_RES_COMPLIER = windres
|
||
|
||
##################################################################################
|
||
|
||
# 链接库
|
||
LIB_LINK = \
|
||
-lgdi32 \
|
||
-lgdiplus \
|
||
-lmsimg32 \
|
||
-lcomdlg32 \
|
||
-ld3d11 \
|
||
-ldwmapi \
|
||
-ld3dcompiler \
|
||
|
||
# C定义
|
||
C_DEFS = \
|
||
_UNICODE \
|
||
UNICODE \
|
||
|
||
# C头文件目录
|
||
C_INCLUDES_PATHS = \
|
||
|
||
# C源文件目录
|
||
C_SOURCES_PATHS = \
|
||
|
||
# C额外单个源文件
|
||
C_EXTERA_SOURCES = \
|
||
|
||
# C++定义
|
||
CXX_DEFS = \
|
||
_UNICODE \
|
||
UNICODE \
|
||
|
||
# C++ 头文件目录
|
||
CXX_INCLUDES_PATHS = \
|
||
Utilities/Inc \
|
||
Resources/Inc \
|
||
Components/Main/Inc \
|
||
Components/Shared/Inc \
|
||
Components/Application/Inc \
|
||
Components/TabBar/Inc \
|
||
Components/Toolbar/Inc \
|
||
Components/SignalPanel/Inc \
|
||
Components/PlotView/Inc \
|
||
|
||
# C++源文件目录
|
||
CXX_SOURCES_PATHS = \
|
||
Utilities/Src \
|
||
Components/Main/Src \
|
||
Components/Shared/Src \
|
||
Components/Application/Src \
|
||
Components/TabBar/Src \
|
||
Components/Toolbar/Src \
|
||
Components/SignalPanel/Src \
|
||
Components/PlotView/Src \
|
||
|
||
# C++额外单个源文件
|
||
CXX_EXTERA_SOURCES = \
|
||
|
||
# Windows 资源文件脚本头文件路径
|
||
WIN_RESOURCE_INCLUDES_PATHS = \
|
||
Resources \
|
||
Resources/Inc \
|
||
# Windows 资源文件脚本输入代码页(对应 INPUT_CHAR_ENCODING = UTF-8)
|
||
WIN_RESOURCE_CODEPAGE = 65001
|
||
# Windows 资源文件脚本列表
|
||
WIN_RESOURCE_SCRIPTS = \
|
||
Resources/JustDataInspector.rc \
|
||
|
||
##################################################################################
|
||
|
||
# C编译选项
|
||
CFLAGS = $(foreach text,$(C_DEFS),$(addprefix -D,$(text))) \
|
||
$(foreach path,$(C_INCLUDES_PATHS),$(addprefix -I,$(path))) \
|
||
-std=$(strip $(C_STD)) \
|
||
-finput-charset=$(strip $(INPUT_CHAR_ENCODING)) \
|
||
-fexec-charset=$(strip $(OUTPUT_CHAR_ENCODING)) \
|
||
-fwide-exec-charset=$(strip $(OUTPUT_WCHAR_ENCODING)) \
|
||
-static \
|
||
-Wall \
|
||
-MMD -MP -MF"$(@:%.o=%.d)" \
|
||
|
||
# C++编译选项
|
||
CXXFLAGS = $(foreach text,$(CXX_DEFS),$(addprefix -D,$(text))) \
|
||
$(foreach path,$(CXX_INCLUDES_PATHS),$(addprefix -I,$(path))) \
|
||
-std=$(strip $(CXX_STD)) \
|
||
-finput-charset=$(strip $(INPUT_CHAR_ENCODING)) \
|
||
-fexec-charset=$(strip $(OUTPUT_CHAR_ENCODING)) \
|
||
-fwide-exec-charset=$(strip $(OUTPUT_WCHAR_ENCODING)) \
|
||
-static \
|
||
-Wall \
|
||
-MMD -MP -MF"$(@:%.o=%.d)" \
|
||
-lstdc++ \
|
||
|
||
# 链接选项
|
||
LDFLAGS = -Wl,-Map,$(basename $@).map \
|
||
|
||
##################################################################################
|
||
|
||
# GUI与CUI选项附加
|
||
ifeq ($(GUI), 1)
|
||
LDFLAGS += -mwindows
|
||
else
|
||
LDFLAGS += -mconsole
|
||
endif
|
||
|
||
# C目标文件及索引目录关联
|
||
OBJECTS = $(notdir $(C_EXTERA_SOURCES:.c=.o))
|
||
OBJECTS += $(subst .c,.o,$(notdir $(foreach path,$(C_SOURCES_PATHS),$(wildcard $(path)/*.c))))
|
||
vpath %.c $(sort $(dir $(C_EXTERA_SOURCES))) $(sort $(C_SOURCES_PATHS))
|
||
|
||
# C++目标文件及索引目录关联
|
||
OBJECTS += $(notdir $(CXX_EXTERA_SOURCES:.cpp=.o))
|
||
OBJECTS += $(subst .cpp,.o,$(notdir $(foreach path,$(CXX_SOURCES_PATHS),$(wildcard $(path)/*.cpp))))
|
||
vpath %.cpp $(sort $(dir $(CXX_EXTERA_SOURCES))) $(sort $(CXX_SOURCES_PATHS))
|
||
|
||
# Windows资源文件及索引目录关联
|
||
OBJECTS += $(notdir $(WIN_RESOURCE_SCRIPTS:.rc=.o))
|
||
vpath %.rc $(sort $(dir $(WIN_RESOURCE_SCRIPTS)))
|
||
|
||
|
||
# Release 目标文件
|
||
RELEASE_OBJECTS = $(addprefix $(BUILD_DIR)/$(SUB_DIR_RELEASE)/,$(OBJECTS))
|
||
|
||
# Debug 目标文件
|
||
DEBUG_OBJECTS = $(addprefix $(BUILD_DIR)/$(SUB_DIR_DEBUG)/,$(OBJECTS))
|
||
|
||
##################################################################################
|
||
|
||
# all任务 目标为 release 和 debug 产物
|
||
all: $(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).exe $(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).exe
|
||
@echo ====== [All] Build Procedure Accomplished ======
|
||
|
||
# release任务 目标为 release 产物
|
||
release: $(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).exe
|
||
@echo ====== [Release] Build Procedure Accomplished ======
|
||
|
||
# debug任务 目标为 debug 产物
|
||
debug: $(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).exe
|
||
@echo ====== [Debug] Build Procedure Accomplished ======
|
||
|
||
# 清理任务
|
||
clean: $(BUILD_DIR)
|
||
powershell rm -r $(BUILD_DIR)
|
||
|
||
# 构建目录生成
|
||
$(BUILD_DIR):
|
||
powershell mkdir $@
|
||
|
||
# Release 工作目录生成
|
||
$(BUILD_DIR)/$(SUB_DIR_RELEASE): | $(BUILD_DIR)
|
||
powershell mkdir $@
|
||
|
||
# Debug 工作目录生成
|
||
$(BUILD_DIR)/$(SUB_DIR_DEBUG): | $(BUILD_DIR)
|
||
powershell mkdir $@
|
||
|
||
# Release 最终可执行文件编译任务
|
||
$(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(TARGET_FILE_NAME).exe: $(RELEASE_OBJECTS)
|
||
@echo ====== [Release] All File Compiled. Now Linking... ======
|
||
$(CXX_COMPLIER) $(RELEASE_OBJECTS) -static -s -o $@ $(LIB_LINK) $(LDFLAGS)
|
||
@echo ====== [Release] Program Link Finished ======
|
||
|
||
# Debug 最终可执行文件编译任务
|
||
$(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(TARGET_FILE_NAME).exe: $(DEBUG_OBJECTS)
|
||
@echo ====== [Debug] All File Compiled. Now Linking... ======
|
||
$(CXX_COMPLIER) $(DEBUG_OBJECTS) -static -o $@ $(LIB_LINK) $(LDFLAGS)
|
||
@echo ====== [Debug] Program Link Finished ======
|
||
|
||
# C Release 目标文件编译
|
||
$(BUILD_DIR)/$(SUB_DIR_RELEASE)/%.o: %.c Makefile | $(BUILD_DIR)/$(SUB_DIR_RELEASE)
|
||
@echo ====== [Release] C Source File "$<" Compiling... ======
|
||
$(C_COMPLIER) -c $(CFLAGS) $(RELEASE_OPT) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(notdir $(<:.c=.lst)) $< -o $@
|
||
|
||
# C++ Release 目标文件编译
|
||
$(BUILD_DIR)/$(SUB_DIR_RELEASE)/%.o: %.cpp Makefile | $(BUILD_DIR)/$(SUB_DIR_RELEASE)
|
||
@echo ====== [Release] C++ Source File "$<" Compiling... ======
|
||
$(CXX_COMPLIER) -c $(CXXFLAGS) $(RELEASE_OPT) -Wa,-a,-ad,-ahlms=$(BUILD_DIR)/$(SUB_DIR_RELEASE)/$(notdir $(<:.cpp=.lst)) $< -o $@
|
||
|
||
# Release 资源脚本文件编译
|
||
$(BUILD_DIR)/$(SUB_DIR_RELEASE)/%.o: %.rc Makefile | $(BUILD_DIR)/$(SUB_DIR_RELEASE)
|
||
@echo ====== [Release] Windows Resource Script File "$<" Compiling... ======
|
||
$(WIN_RES_COMPLIER) -c $(WIN_RESOURCE_CODEPAGE) $(foreach path,$(WIN_RESOURCE_INCLUDES_PATHS),$(addprefix -I,$(path))) $< -o $@
|
||
|
||
# C Debug 目标文件编译
|
||
$(BUILD_DIR)/$(SUB_DIR_DEBUG)/%.o: %.c Makefile | $(BUILD_DIR)/$(SUB_DIR_DEBUG)
|
||
@echo ====== [Debug] C Source File "$<" Compiling... ======
|
||
$(C_COMPLIER) -c $(CFLAGS) $(DEBUG_OPT) -g -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(notdir $(<:.c=.lst)) $< -o $@
|
||
|
||
# C++ Debug 目标文件编译
|
||
$(BUILD_DIR)/$(SUB_DIR_DEBUG)/%.o: %.cpp Makefile | $(BUILD_DIR)/$(SUB_DIR_DEBUG)
|
||
@echo ====== [Debug] C++ Source File "$<" Compiling... ======
|
||
$(CXX_COMPLIER) -c $(CXXFLAGS) $(DEBUG_OPT) -g -Wa,-a,-ad,-ahlms=$(BUILD_DIR)/$(SUB_DIR_DEBUG)/$(notdir $(<:.cpp=.lst)) $< -o $@
|
||
|
||
# Debug 资源脚本文件编译
|
||
$(BUILD_DIR)/$(SUB_DIR_DEBUG)/%.o: %.rc Makefile | $(BUILD_DIR)/$(SUB_DIR_DEBUG)
|
||
@echo ====== [Debug] Windows Resource Script File "$<" Compiling... ======
|
||
$(WIN_RES_COMPLIER) -c $(WIN_RESOURCE_CODEPAGE) $(foreach path,$(WIN_RESOURCE_INCLUDES_PATHS),$(addprefix -I,$(path))) $< -o $@
|
||
|
||
|
||
# 依赖关系
|
||
-include $(RELEASE_OBJECTS:.o=.d)
|
||
-include $(DEBUG_OBJECTS:.o=.d) |