在GPR文件中传递多个链接库

ere*_*sch 5 linux ada gnat

是否可以通过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;
Run Code Online (Sandbox Code Playgroud)

但是,如果我包含一个以空格分隔的存档文件列表的环境变量,则会收到错误消息:

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;
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

因此,似乎将Linker程序包中的单个参数解释为包含空格的单个文件。我认为这些项目需要用逗号分隔或以某种方式分隔,但是我该如何以对我的GCC创建的程序和GNAT创建的程序使用相同的变量的方式来执行此操作?

Sim*_*ght 7

您需要external_as_list

...
external_as_list("LINKLIBS", " "),
...
Run Code Online (Sandbox Code Playgroud)

但请注意,这是一个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;
Run Code Online (Sandbox Code Playgroud)