我正在使用 MSYS2/MINGW64。 我有 avr atmega328 微控制器的代码,这段代码是使用 avr-gcc 12.2.0 和 Makefile 编译的,没有错误。 我想用clang 16.0.1编译这个,我修复了Makefile,编译时遇到错误:
"C:/msys64/mingw64/bin/avr-ld" -o ComponentTester --gc-sections -LC:/msys64/mingw64/bin/../lib/avr -LC:/msys64/mingw64/bin/../lib/gcc/avr/12.2.0/../../../avr/lib/avr5 -LC:/msys64/mingw64/bin/../lib/gcc/avr/12.2.0/avr5 -Tdata=0x800100 --start-group -l:crtatmega328.o -lgcc -lm -lc -latmega328 -Map=ComponentTester.map main.o user.o pause.o adjust.o ADC.o probes.o
display.o resistor.o cap.o semi.o inductor.o tools_misc.o tools_signal.o tools_counter.o tools_LC_Meter.o SPI.o I2C.o serial.o commands.o OneWire.o IR_RX.o IR_TX.o DHTxx.o ADS7843.o MAX6675.o MAX31855.o HD44780.o ILI9163.o ILI9341.o ILI9481.o ILI9486.o ILI9488.o PCD8544.o PCF8814.o SH1106.o SSD1306.o ST7036.o ST7565R.o ST7735.o Semi_ST7735.o ST7920.o STE2007.o
VT100.o RD_Display.o wait.o --end-group -mavr5
C:/msys64/mingw64/bin/avr-ld: cannot find -l:crtatmega328.o: No such file or directory
C:/msys64/mingw64/bin/avr-ld: cannot find -lm: No such file or directory
C:/msys64/mingw64/bin/avr-ld: cannot find -lc: No such file or directory
C:/msys64/mingw64/bin/avr-ld: cannot find -latmega328: No such file or directory
main.o: file not recognized: file format not recognized
clang: error: avr-ld command failed with exit code 1 (use -v to see invocation)
make: *** [Makefile:182: ComponentTester] Error 1
据我了解,错误是在链接时,无法沿着路径 C:\msys64\mingw64 vr\lib vr5 找到 crtatmega328.o 文件,但如果通过资源管理器,则此文件会在那里
我试图在 Makefile 中强行指定: -L C:/msys64/mingw64/avr/lib/avr5 然后编译器出现以下消息
"C:/msys64/mingw64/bin/avr-ld" -o ComponentTester --gc-sections -LC:/msys64/mingw64/avr/lib/avr5 -LC:/msys64/mingw64/bin/../lib/avr -LC:/msys64/mingw64/bin/../lib/gcc/avr/12.2.0/../../../avr/lib/avr5 -LC:/msys64/mingw64/bin/../lib/gcc/avr/12.2.0/avr5 -Tdata=0x800100 --start-group -l:crtatmega328.o -lgcc -lm -lc -latmega328 -Map=ComponentTester.map main.o user.
o pause.o adjust.o ADC.o probes.o display.o resistor.o cap.o semi.o inductor.o tools_misc.o tools_signal.o tools_counter.o tools_LC_Meter.o SPI.o I2C.o serial.o commands.o OneWire.o IR_RX.o IR_TX.o DHTxx.o ADS7843.o MAX6675.o MAX31855.o HD44780.o ILI9163.o ILI9341.o ILI9481.o ILI9486.o ILI9488.o PCD8544.o PCF8814.o SH1106.o SSD1306.o ST7036.o ST7565R.o ST7735.o
Semi_ST7735.o ST7920.o STE2007.o VT100.o RD_Display.o wait.o --end-group -mavr5
main.o: file not recognized: file format not recognized
clang: error: avr-ld command failed with exit code 1 (use -v to see invocation)
make: *** [Makefile:182: ComponentTester] Error 1
可以通过删除编译器标志 -flto 来编译代码。 但是编译文件的大小与 gcc 相比太大了
AVR Memory Usage (CLANG)
----------------
Device: atmega328
Program: 38812 bytes (118.4% Full)
(.text + .data + .bootloader)
Data: 5925 bytes (289.3% Full)
(.data + .bss + .noinit)
EEPROM: 771 bytes (75.3% Full)
(.eeprom)
AVR Memory Usage (GCC)
----------------
Device: atmega328
Program: 34210 bytes (104.4% Full)
(.text + .data + .bootloader)
Data: 276 bytes (13.5% Full)
(.data + .bss + .noinit)
EEPROM: 771 bytes (75.3% Full)
(.eeprom)
我也安装了 avr-libc 2.1.0-1, gcc-libs 12.2.0-10
为什么clang找不到目录下的文件?
avr-gcc
(或avr-g++
)链接,而不是avr-ld
报错的是
avr-ld
。
有关更多详细信息,请参见例如this answer:avr-gcc
,这是一个驱动程序,在调用链接器时将添加许多选项,例如-L
搜索路径,与-l
链接的库,调用LTO插件的选项,以及许多其他人。
我试图在Makefile中强行指定:
-L C:/msys64/mingw64/avr/lib/avr5
-L
添加搜索路径,它指向工具链手动提供的库。编译器驱动程序
avr-gcc
将添加指向正确的 libc、libm、libgcc 和设备库的路径。驱动程序使用像-mmcu=
这样的命令行选项来
确定正确的路径。如果找不到像 libgcc.a
或 libc.a
这样的系统库,那么您的工具链就坏了。获得一个可用的工具链。
可以通过删除编译器标志来编译代码
-flto
LTO 没有按预期工作的一个原因是因为你使用了
avr-ld
来排线,见 1.
除此之外,LTO 字节码没有标准化。即使是不同的主要版本的 GCC 也可能使用不同的、不兼容的字节码版本。您必须使用相同的 GCC 版本进行编译和 LTO 编译。 GCC 的 LTO 编译器,
lto1
可能无法使用 LLVM 的字节码。充其量,链接器插件检测到不存在(有效的)LTO 字节码,并完全跳过 LTO。