有两个选项可以链接 ldc 吐出的编译目标文件:使用 avr-gcc 的链接器,或使用 llvm 的内部链接器。参数 -gcc=avr-gcc 告诉它在哪里可以找到 avr-gcc 工具,或者您可以使用 --link-internally 代替,它使用 llvm 的内置链接器。两者都会起作用。
使用-gcc 的好处是你可以将它指向你的 arduino studio 安装——无论如何你可能都想要它,因为它有 objcopy、avrdude 等程序以及其他有用的东西——并且让它正常工作,并与其他库和工具等更好地集成,例如 gcc 提供的 C 运行时。
$ PATH=/opt/arduino/arduino-1.8.10/hardware/tools/avr/bin:$PATH ldc2 -betterC -Oz -mtriple=avr -mcpu=atmega328p -gcc=avr-gcc delay.d
$ file delay
delay: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, with debug_info, not stripped
$ ls -l delay
-rwxr-xr-x 1 me users 2440 Sep 18 08:28 delay
使用 PATH 中的 arduino 工具,-gcc=avr-gcc 参数就可以工作。
使用 --link-internally,您不需要任何这些,但是:
$ ldc2 -betterC -Oz -mtriple=avr -mcpu=atmega328p --link-internally delay.d
lld: warning: cannot find entry symbol _start; defaulting to 0x110B4
$ file delay
delay: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, not stripped
$ ls -l delay
-rwxr-xr-x 1 me users 708 Sep 18 08:31 delay
请注意它已链接,但它给出了关于缺少 _start 的警告。还要注意不同的文件大小。这是因为 gcc 提供的 C 运行时存根具有该开始符号,它会执行一些基本设置,然后调用您的 extern(C) main。没有它,您将需要自己做更多的事情。我敢肯定,您也可以通过在链接命令中列出 lib/object 文件来让 ldc 进行链接……但是使用 -avr-gcc,它可以正常工作,因为它已经知道在哪里可以找到所有这些东西。