1. 我想要达到的目标
我的终极目标是将Arduino项目(sketches)转换为基于makefile的自包含C/C++项目。
我已经有了一些进展(感谢@Juraj提供的有用评论)。我将所有相关的Arduino *.cpp
和*.h
文件复制到一个文件夹中(我称之为我的“项目文件夹”),以及预处理后的sketch文件(Arduino预处理器将sketch文件转换为*.cpp
文件)。
我添加了一个内部的makefile,构建非常顺利。但是,在链接的最后一步中,我仍然不知道使用了哪个linkerscript。
2. 问题解释
尽管构建 - 包括链接步骤 - 运行得很好,但我想知道正在使用哪个linkerscript。目前,avr-gcc
工具链从其安装文件夹中选择一个linkerscript:
<arduino ide installation>/hardware/tools/avr/avr/lib/ldscripts
正如@Juraj在评论中所解释的那样,此工具链基于-mmcu
标志进行选择。
我不希望编译器从avr-gcc
工具链中选择一个固定的链接脚本。相反,我想将此链接脚本复制到我的项目文件夹中并能够对其进行调整。但是为了做到这一点- 我必须首先知道它是哪个链接脚本。我该怎么办呢?
3. 背景资料
下面您可以找到有关我的设置和系统的更多信息。
3.1.我的设置
我有一个基于ATmega328P
微控制器的Arduino UNO R3
。我正在使用Ubuntu 20.04.1 LTS
操作系统。
我安装了Arduino IDE并从以下位置创建了一个新项目:
File > Examples > 01.Basics > Blink
我将新项目保存在 ~/Arduino/sketch_uno_blinky/sketch_uno_blinky.ino
。
最后,我在以下位置打勾:
File > Preferences > Show verbose output
这样我就能正确地查看编译输出。基于此,我可以追踪所有参与构建的*.cpp
和*.h
文件。我将它们复制到一个文件夹中,以便创建一个自包含的基于makefile的项目。
3.2 链接
我这样运行链接器:
avr-gcc -Wl,-Map=output.map
-Wl,--gc-sections
-mmcu=atmega328p
-DF_CPU=16000000L
-DARDUINO=10813
-DARDUINO_AVR_UNO
-DARDUINO_ARCH_AVR
-Og
-g3
-MMD
-fmessage-length=0
-ffunction-sections
-fdata-sections
-Wno-comment
-Wno-unused-function
-Werror-implicit-function-declaration
-w
-lm
-flto
-fuse-linker-plugin
-L ../config/
-o application.elf
WInterrupts.o
main.o
hooks.o
wiring.o
wiring_analog.o
wiring_digital.o
wiring_pulse.o
wiring_shift.o
[...]
sketch_uno_blinky.ino.o
这将导致生成名为
application.elf
的固件。
-mmcu=
标志。我还需要在某个地方添加specs
文件吗?或者不需要吗? - K.Mulier