如何阻止Lazarus为程序链接未使用的依赖库?
问题描述
我使用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

