You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止Lazarus为程序链接未使用的依赖库?

解决Lazarus构建Debian包时dpkg-shlibdeps的无用依赖警告

问题描述

我使用Lazarus构建GUI程序并打包为Debian包时,收到以下dpkg-shlibdeps警告:

dpkg-shlibdeps: warning: package could avoid a useless dependency if program_name was not linked against libgmodule-2.0.so.0 (it uses none of the library's symbols)
dpkg-shlibdeps: warning: package could avoid a useless dependency if program_name was not linked against libcairo.so.2 (it uses none of the library's symbols)
dpkg-shlibdeps: warning: package could avoid a useless dependency if program_name was not linked against libatk-1.0.so.0 (it uses none of the library's symbols)

当前使用的编译器选项如下:

Info: (lazarus) Executable="/usr/bin/fpc"
Info: (lazarus) Param[0]="-MObjFPC"
Info: (lazarus) Param[1]="-Scghi"
Info: (lazarus) Param[2]="-CX"
Info: (lazarus) Param[3]="-O3"
Info: (lazarus) Param[4]="-Xs"
Info: (lazarus) Param[5]="-XX"
Info: (lazarus) Param[6]="-l"
Info: (lazarus) Param[7]="-vewnhibq"
Info: (lazarus) Param[8]="-Fi/path/to/program_folder/lib/arm-linux"
Info: (lazarus) Param[9]="-Fu/path/to/program_folder/TLazSerial/lib/arm-linux"
Info: (lazarus) Param[10]="-Fu/usr/lib/lazarus/2.0.10/components/ideintf/units/arm-linux/gtk2"
Info: (lazarus) Param[11]="-Fu/usr/lib/lazarus/2.0.10/components/lazcontrols/lib/arm-linux/gtk2"
Info: (lazarus) Param[12]="-Fu/usr/lib/lazarus/2.0.10/lcl/units/arm-linux/gtk2"
Info: (lazarus) Param[13]="-Fu/usr/lib/lazarus/2.0.10/lcl/units/arm-linux"
Info: (lazarus) Param[14]="-Fu/usr/lib/lazarus/2.0.10/components/lazutils/lib/arm-linux"
Info: (lazarus) Param[15]="-Fu/usr/lib/lazarus/2.0.10/packager/units/arm-linux"
Info: (lazarus) Param[16]="-Fu/path/to/program_folder/"
Info: (lazarus) Param[17]="-FU/path/to/program_folder/lib/arm-linux/"
Info: (lazarus) Param[18]="-FE/path/to/program_folder/"
Info: (lazarus) Param[19]="-o/path/to/program_folder/program_name"
Info: (lazarus) Param[20]="-dUseCThreads"
Info: (lazarus) Param[21]="-dLCL"
Info: (lazarus) Param[22]="-dLCLgtk2"
Info: (lazarus) Param[23]="program_name.lpr"

请问有没有办法阻止程序链接这些未使用的库?


解决方法

1. 添加FPC链接优化选项

你已经启用了-Xs(剥离未使用符号)和-XX(移除未使用代码),可以再添加-Xd选项——它会告诉链接器仅链接程序实际调用的库,而非依赖链中的全部库。直接将-Xd加入编译器参数列表即可。

2. 手动管控依赖库

先通过命令nm -D program_name查看程序实际用到的符号,明确必须依赖的库,然后在Lazarus项目设置的「链接」选项中,手动添加必要库并排除未被使用的库。注意:此方法需要你对项目依赖关系有清晰认知,避免误删必要依赖。

3. 打包阶段忽略无用依赖

如果编译层面无法彻底解决,可在打包时让dpkg-shlibdeps忽略这些警告。在debian/rules文件中添加以下内容:

override_dh_shlibdeps:
	dh_shlibdeps --dpkg-shlibdeps-params=--exclude-libs=libgmodule-2.0.so.0,libcairo.so.2,libatk-1.0.so.0

这属于打包阶段的临时解决方案,并未从根本上消除程序对无用库的链接。

4. 清理LCL组件依赖

你使用的是GTK2界面,LCL的GTK2绑定可能默认链接了整个GTK2依赖栈。检查项目中是否引入了不必要的LCL组件(比如未用到的Cairo/ATK相关控件),移除这些组件引用后重新编译。


内容的提问来源于stack exchange,提问作者Dmitry Grigoryev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 18:33:17