Ada2012 & GNAT:如何在编译时为库添加命名空间?
关于GNAT编译时为遗留库添加命名空间的解决方案
GNAT没有直接在编译阶段给现有全局符号批量套命名空间的原生选项,但可以通过包装包+GNAT编译工具链的方式实现,不用改原库代码,也比写Python脚本更省心:
- 先单独编译遗留库,用
-gnatQ选项保留全局符号的原始名称,生成目标文件和ALI文件:gnatmake -c -gnatQ legacy_source.adb ar rcs legacy_lib.a legacy_lib.o - 编写一个根包作为命名空间容器,比如
legacy_lib.ads,在包里通过pragma Import把全局符号导入到包的命名空间下:package Legacy_Lib is -- 导入单个全局过程 procedure Do_Something; pragma Import (Ada, Do_Something, External_Name => "do_something"); -- 导入全局类型 type Legacy_Type is new Integer; pragma Import (Ada, Legacy_Type, External_Name => "legacy_type"); end Legacy_Lib; - 如果符号数量极多,用GNAT的
gnatls工具导出库的所有全局符号,再用简单脚本自动生成包装包代码:
之后用awk或shell脚本遍历gnatls -s legacy_lib.a > symbols.txtsymbols.txt,批量生成pragma Import语句,比手动编写或Python脚本更适配Ada语法规则。
这种方法的优势是不用修改遗留库源代码,原库更新后仅需重新编译包装包即可;若遇到符号名与Ada关键字冲突的情况,还能在包装包里直接重命名符号,灵活性更高。
内容的提问来源于stack exchange,提问作者Albatros23
相关产品推荐
相关产品推荐

