GCC源码编译libada问题:libgnat区别、libgnarl.lst获取及编译指南
问题1:libgnat与libgnarl二者有什么区别?
- libgnat是GNAT实现的Ada核心运行库,包含Ada标准规范定义的基础通用能力:基础类型支持、字符串处理、通用容器、异常处理、基础I/O等不依赖多任务调度的功能,是所有Ada程序运行的必备依赖。
- libgnarl全称为GNAT Ada Runtime Library for tasking,是Ada多任务特性的专属运行库,包含任务调度、同步原语(保护对象、入口、屏障等)、实时调度策略、中断处理等并发、实时相关功能实现。若Ada程序未使用多任务特性,理论上可不用链接libgnarl,但标准GNAT发行版默认会同时提供两个库。
问题2:可以从哪里获取libgnarl.lst文件?
libgnarl.lst是编译Ada运行库阶段自动生成的中间文件,不属于GCC源码包自带的静态文件,不需要额外下载获取。你遇到的缺失问题本质是首次全量编译GCC时没有完整执行Ada运行库的编译流程,可按以下步骤生成该文件:
- 回到GCC编译的根目录,不要直接进入
gcc/ada/libgnat目录单独编译 - 确认已经完成GCC的bootstrap编译,即已经执行过
make完成GCC主程序的编译 - 执行
make all-target-libada,命令会自动完成libgnat、libgnarl的全量编译,过程中会自动生成你需要的libgnarl.lst文件,存放在编译目录的对应target子目录下。
问题3:是否有通用的libada编译指引可供参考?
通用编译流程如下:
- 前置依赖:编译前需要提前安装一个可用的旧版本GNAT编译器(二进制版本即可),因为编译Ada运行库本身需要Ada编译器支持,这是GCC编译Ada语言的循环依赖要求,绝大多数人编译后缺失libada都是漏了这一步,直接用无Ada支持的GCC编译Ada目标。
- 配置阶段:你使用的配置参数基本正确,若需要编译跨平台的libada,可额外添加
--target=参数指定目标架构,也可按需添加--enable-shared参数生成动态库。 - 编译阶段:先执行
make all完成GCC主体编译,再执行make all-target-libada专门编译Ada运行库,不要单独进入源码目录用gprbuild编译,全量编译流程会自动处理所有依赖文件的生成和路径配置。 - 安装阶段:执行
make install-target-libada即可将libgnat、libgnarl、对应的GPR配置文件、Ada标准头文件全部安装到你之前configure指定的prefix目录下。
内容的提问来源于stack exchange,提问作者flyingsheep
相关产品推荐
相关产品推荐

