如何在GPRbuild中仅用.ads与.a静态库构建Ada项目
解决方案
要实现仅用.ads接口文件和.a静态库文件编译可执行项目,核心是让gprbuild仅用.ads做语义分析,不尝试编译它,同时能正确链接静态库。以下是两种可行方案:
方案一:直接在可执行项目中配置接口路径与链接参数
无需依赖库的gpr文件,直接在可执行项目的gpr中指定.ads的查找路径,并配置链接静态库的参数:
修改Test.gpr为:
project Test is for Source_Dirs use ("src"); for Object_Dir use ("obj"); for Main use ("test.adb"); -- 添加库接口文件的目录到源查找路径(仅用于语义分析,不编译) for Source_Path use Source_Path & ("../Libraries/src"); package Linker is for Default_Switches ("ada") use ("-L../Libraries/lib", "-lmy_lib"); end Linker; end Test;
原理
Source_Path用于指定依赖接口文件的查找位置,gprbuild会读取这里的.ads进行类型检查、依赖解析,但不会编译这些文件。- 链接器参数直接指定静态库的目录和名称,确保最终可执行文件能正确链接
.a文件。
方案二:将库项目改为纯接口项目
把原库的gpr文件改为纯接口项目(pure project),这样它只会提供.ads接口,不会尝试编译源文件,同时自动传递链接参数给依赖项目:
修改my_lib.gpr为:
pure project my_lib is for Languages use ("Ada"); for Source_Dirs use ("src"); -- 配置链接参数,供依赖项目继承 package Linker is for Default_Switches ("ada") use ("-L../Libraries/lib", "-lmy_lib"); end Linker; end my_lib;
可执行项目的Test.gpr保持原with "../Libraries/my_lib.gpr";的配置即可。
原理
pure project是Ada项目中专门用于提供接口的类型,不会生成任何二进制文件,仅负责暴露.ads接口。- 链接参数配置在库项目中,可执行项目
with该库后会自动继承链接规则,无需重复配置。
为什么原有配置会报错?
- 原库项目是
library project,gprbuild会尝试编译Source_Dirs下的所有源文件,当仅存.ads时,编译器无法为单独的包规范生成可执行代码,因此报错。 - 使用
Excluded_Source_Files排除.ads后,可执行项目在编译时找不到接口文件,导致语义分析失败。
内容的提问来源于stack exchange,提问作者dimercur
相关产品推荐
相关产品推荐

