Linker GPRbuild:传递给链接器的编译器开关

Linker GPRbuild:传递给链接器的编译器开关,linker,arm,ada,gnat,gprbuild,Linker,Arm,Ada,Gnat,Gprbuild,我正在为ARM构建一个简单的程序。GPRbuild输出以下内容: gprbuild -p -P avocado_test.gpr (in directory: /home/rodeo/Projects/AvocadoTest) Bind [gprbind] run_avocado_test.bexch [Ada] run_avocado_test.ali Link [link] run_avocado_test.adb /opt/GN

我正在为ARM构建一个简单的程序。GPRbuild输出以下内容:

gprbuild -p -P avocado_test.gpr (in directory: /home/rodeo/Projects/AvocadoTest)
Bind
   [gprbind]      run_avocado_test.bexch
   [Ada]          run_avocado_test.ali
Link
   [link]         run_avocado_test.adb
/opt/GNAT/arm-elf/bin/arm-eabi-ld: unrecognised emulation mode: cpu=cortex-m3
Supported emulations: armelf
gprbuild: link of run_avocado_test.adb failed
Compilation failed.

从我在网上看到的,ld有一个开关-m,它指定了一种模拟模式。但是,我没有在项目的链接器中使用此开关。不过,我在编译器中使用了-mcpu=cortex-m3开关,看起来GPRbuild也在将这个开关传递给链接器。这是我的.gpr文件:

为什么链接器要从编译器中进行切换?如何防止这种情况发生?

在您的任何GPR软件包中,我都不会使用驱动程序。一旦gprbuild看到目标使用arm eabi;它知道为每个工具预先设置臂eabi

没有理由避免将编译器开关传递给默认的链接器驱动程序,在本例中是gcc,即arm-eabi-gcc,因为它知道要传递给链接器的是哪一个


您可能会从我的项目中发现这些有趣的内容:但请注意,细节可能与AdaCore的运行时不同。

您没有显示整个GPR,因此很难判断。我看了一下我的裸机项目。我从不在项目GPR中指定这些参数,因为我的runtime的runtime.xml文件将它们插入正确的位置。您是否尝试过不指定它们,并查看运行时在生成时是否适当地添加了它们?我已编辑以包含完整的.gpr文件。注释掉链接器的驱动程序属性会导致一些不同的错误,这些错误来自我构建的库。看起来我需要查看runtime.xml文件,也许还需要重建库,因为编译器和链接器包在该项目中看起来很相似。谢谢你的想法。所以,原来在runtime.xml文件中,编译器开关附加到了链接器的Required_switches属性。此文件和运行时是从Adacore的bb运行时生成的。这没有任何意义,为什么编译器开关会附加到链接器开关上?我不知道GPRBuild是什么,但一般来说,将任何用户级程序直接链接到ld是错误的-在这里应该始终使用编译器驱动程序arm eabi gcc。哦,我不知道编译器能够像那样选择正确的链接器。谢谢,似乎从所有东西中删除驱动程序已经解决了这个问题。对于我在另一条评论中提到的库项目,我也必须这样做,我在该评论中提到的不同错误是因为我将库构建为独立库,这似乎意味着它不使用或不包含运行时。
project Avocado_Test is

   for Source_Dirs use ("source");
   for Object_Dir  use "build";
   for Main use ("source/run_avocado_test.adb");

   for Target use "arm-eabi";
   for Runtime ("Ada") use "ravenscar-sfp-sam3x8e";

   package Builder is
      for Executable_Suffix use ".elf";
      for Switches ("Ada") use ("-j0");
   end Builder;

   package Compiler is
      for Driver ("Ada") use "arm-eabi-gcc";
      for Switches ("Ada") use (
        "-mthumb",
        "-mcpu=cortex-m3",
        "-O2");
   end Compiler;

   package Binder is
      for Driver ("Ada") use "arm-eabi-gnatbind";
   end Binder;

   package Linker is
      for Driver use "arm-eabi-ld";
   end Linker;

end Avocado_Test;