在 GPR 文件中传递多个 link 库

Passing multiple link libraries in GPR file

是否可以通过 GNAT 中的环境变量将多个对象传递给 linker?我有一个环境变量(我们称它为 LINKLIBS),其中包含一个 space 分隔的额外库列表,这些库将在 link 时引入可执行文件。在 GNU Make 中,我们只需将 link 行定义为“$(LD) -o output_file main.o obj1.o obj2.o $(LINKLIBS)”,然后link按照通常的规则,将 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;

但是,如果我包含一个具有 space 分隔的存档文件列表的环境变量,我反而会收到错误消息:

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

因此,它似乎将链接器包中的单个参数解释为包含 spaces 的单个文件。我假设这些项目需要用逗号分隔或类似的东西,但是我怎样才能以对我的 GCC 创建的程序和我的 GNAT 创建的程序使用相同变量的方式做到这一点?

你需要external_as_list:

...
external_as_list("LINKLIBS", " "),
...

但请注意,这是一个 列表,因此您必须这样使用它:

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;