如何让C++Builder程序无需依赖DLL链接?附程序大小合理性疑问
解决C++Builder Clang编译独立EXE及程序大小问题
一、消除DLL依赖生成独立EXE
针对你遇到的cc32c280mt.dll、borlndmm.dll等依赖问题,可按以下步骤调整:
- 修改C++运行时库链接方式:打开项目选项(
Project -> Options),进入C++ Compiler -> Linking,将Runtime Library设置为Multi-threaded (/MT)(Release构建),把C/C++运行时库静态嵌入EXE,避免依赖cc32cxxx系列动态库。 - 静态链接FireDAC:在项目选项的
FireDAC -> Linking中,勾选Link with FireDAC statically,确保FireDAC核心库被静态编译进EXE,而非依赖动态组件。 - 禁用Borland内存管理器:在项目选项的
C++ Compiler -> Preprocessor中添加预定义宏_NO_VCL_MEMMGR,让程序使用标准C++内存管理器,不再依赖borlndmm.dll。 - 检查组件链接状态:确认所有使用的VCL/FMX、第三方组件均为静态链接,保持
Link with runtime packages为False,且未手动添加动态包依赖。
二、关于FireDAC+SQLite程序18-20MB大小的合理性
- 这个体积是合理的。Clang静态链接C运行时库、FireDAC静态库及SQLite驱动后,这些模块的代码量总和本身较大:FireDAC包含大量数据库抽象层逻辑,C静态运行时库也占据一定体积,再加上业务代码,18-20MB属于正常范围。
- 若需缩小体积,可尝试以下优化:
- 启用链接时优化(LTO):在项目选项
C++ Compiler -> Optimization中勾选Link-Time Optimization,编译器会在链接阶段合并优化冗余代码。 - 开启EXE压缩:在项目选项
C++ Linker -> Output中勾选Compress EXE,或使用UPX等工具对最终EXE压缩(注意:压缩可能小幅影响启动速度,需测试兼容性)。 - 裁剪FireDAC组件:仅保留SQLite相关驱动和组件,移除未使用的其他数据库驱动(如MySQL、Oracle等),减少静态链接的冗余代码。
- 启用链接时优化(LTO):在项目选项
内容的提问来源于stack exchange,提问作者user3161924
相关产品推荐
相关产品推荐

