如何用gprinstall打包安装含依赖共享库的Ada库项目
Ada项目依赖预编译C/C++共享库的实用解决方案
问题1:如何优雅引入额外共享库,避免冗余包?
不用给每个C/C++依赖单独创建externally_built Ada项目,直接在你的主Ada库GPR项目里统一配置依赖路径和链接规则就行。举个实际的项目配置例子:
project My_Ada_Lib is -- 依赖库的相对路径,假设都放在项目根下的libs和includes目录 Dep_Lib_Dir := Project_Directory & "/libs/"; Dep_Include_Dir := Project_Directory & "/includes/"; package Compiler is -- 给Ada编译器添加头文件搜索路径(如果有C绑定代码的话) for Default_Switches ("Ada") use ("-I" & Dep_Include_Dir); -- 针对C代码的编译选项(如果项目包含C绑定源文件) for Default_Switches ("C") use ("-I" & Dep_Include_Dir); end Compiler; package Linker is -- 指定依赖库的搜索路径和要链接的库 for Default_Switches ("Ada") use ("-L" & Dep_Lib_Dir, "-lmydep1", "-lmydep2"); -- Linux下添加rpath,保证运行时能找到共享库(路径根据安装后的结构调整) for Default_Switches ("Ada") append ("-Wl,-rpath,$ORIGIN/../lib"); end Linker; end My_Ada_Lib;
这种方式把所有依赖的配置集中在主项目里,不会生成一堆冗余的Ada包,简洁很多。
问题2:怎么让预编译C/C++库随Ada库一起通过gprinstall安装?
核心是用GPR项目的Installation包配置额外文件的安装规则。在你的Ada库项目里加上这段:
package Installation is for Library_Dir use "lib"; -- Ada库的安装目录 for Include_Dir use "include"; -- 头文件安装目录 -- 指定要一起安装的预编译共享库 for Extra_Files use ( Dep_Lib_Dir & "libmydep1.so", Dep_Lib_Dir & "libmydep2.so" ); -- 给每个额外文件指定目标安装目录(这里和Ada库放同一目录) for Extra_Files_Dir (Dep_Lib_Dir & "libmydep1.so") use "lib"; for Extra_Files_Dir (Dep_Lib_Dir & "libmydep2.so") use "lib"; end Installation;
然后执行gprinstall的时候,加上--prefix指定安装前缀,比如:
gprinstall -p --prefix=/usr/local my_ada_lib.gpr
这样预编译库会被安装到/usr/local/lib,和你的Ada共享库放在一起。如果之前失败,大概率是路径写错了,用gprinstall -v看详细日志就能排查出问题。
问题3:gprbuild只能输出一个目标文件吗?
当然不是,gprbuild支持输出多个目标,看你怎么配置项目:
- 多可执行文件:在可执行项目里直接指定多个主程序:
运行project My_Apps is for Main use ("app1.adb", "app2.adb"); end My_Apps;gprbuild会同时生成app1和app2两个可执行文件。 - 多库文件:可以通过子项目实现,每个子项目输出一个库,主项目依赖这些子项目,gprbuild会递归构建所有子项目的库。
- 就算是单一库项目,也可以把多个源文件编译成一个库,但这属于单目标的情况,按需选择就行。
内容的提问来源于stack exchange,提问作者Ingmar Alting
相关产品推荐
相关产品推荐

