是否可以通过GNAT中的环境变量将多个对象传递给链接器?我遇到的情况是,我有一个环境变量(我们称其为LINKLIBS),其中包含以空格分隔的额外库列表,这些库在链接时将被带入可执行文件。在GNU Make中,我们仅将链接行定义为“ $(LD)-o output_file main.o obj1.o obj2.o $(LINKLIBS)”,链接器会将LINKLIBS中的所有内容带入对象,但前提是通常的规则。
LINKLIBS可能看起来像这样:“ /usr/lib/libsource-highlight.a /usr/lib/x86_64-linux-gnu/libGLU.a /usr/lib/x86_64-linux-gnu/libmenu.a”
当我在GPR Linker程序包中明确指定了以下两个对象时,它可以正常工作:
package Linker is for Default_Switches ("Ada") use ( "--for-linker=-Map", "--for-linker=../myprog.map", "--for-linker=--start-group", external("LIB_PATH") & "/libabc.a", external("LIB_PATH") & "/lib123.a", "--for-linker=--end-group"); end Linker;
但是,如果我包含一个以空格分隔的存档文件列表的环境变量,则会收到错误消息:
package Linker is for Default_Switches ("Ada") use ( "--for-linker=-Map", "--for-linker=../myprog.map", "--for-linker=--start-group", external("LIB_PATH") & "/libabc.a", external("LIB_PATH") & "/lib123.a", external("LINKLIBS"), "--for-linker=--end-group"); end Linker;
gcc: error: /usr/lib/libsource-highlight.a /usr/lib/x86_64-linux-gnu/libGLU.a /usr/lib/x86_64-linux-gnu/libmenu.a: No such file or directory
因此,似乎将Linker程序包中的单个参数解释为包含空格的单个文件。我认为这些项目需要用逗号分隔或以某种方式分隔,但是我该如何以对我的GCC创建的程序和GNAT创建的程序使用相同的变量的方式来执行此操作?
您需要external_as_list
:
... external_as_list("LINKLIBS", " "), ...
但请注意,这是一个list,因此您必须这样使用它:
package Linker is for Default_Switches ("Ada") use ( "--for-linker=-Map", "--for-linker=../myprog.map", "--for-linker=--start-group", external("LIB_PATH") & "/libabc.a", external("LIB_PATH") & "/lib123.a") & external_as_list("LINKLIBS", " ") & ("--for-linker=--end-group"); end Linker;