我正在尝试重现这个4-key-keyboard ,为此我试图通过在我的Linux机器上用avr-gcc编译来编译its source。
我设法通过使用参数扩展命令行来解决编译器抛出的几个错误,但现在我遇到了以下错误。事情是V-USB上的不少演示项目使用相同的库并抛出相同的错误,我不想在所有代码中进行摔跤,试图为我想要查看的每个项目修复它们。我意识到最好的方法是修复源代码中的错误,但是虽然下面的错误很容易解决,但是抛出新的错误,解决和的所有更改都要复杂得多。源代码我不能保证生成的程序仍然可以正常工作。
我的问题是:avr-gcc是否有一些兼容性命令行参数,使代码编译好像是旧版本的gcc?
这是我用来编译源代码的命令:
avr-gcc main.c -I /usr/lib/avr/include/ -mmcu=attiny85 -DF_CPU=16000000 -Os -I ./usbdrv
这些是avr-gcc抛出的错误:
In file included from main.c:32:0:
./usbdrv/usbdrv.h:455:6: error: variable ‘usbDescriptorDevice’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
./usbdrv/usbdrv.h:461:6: error: variable ‘usbDescriptorConfiguration’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
./usbdrv/usbdrv.h:467:6: error: variable ‘usbDescriptorHidReport’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
./usbdrv/usbdrv.h:473:6: error: variable ‘usbDescriptorString0’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
./usbdrv/usbdrv.h:479:5: error: variable ‘usbDescriptorStringVendor’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
./usbdrv/usbdrv.h:485:5: error: variable ‘usbDescriptorStringDevice’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
./usbdrv/usbdrv.h:491:5: error: variable ‘usbDescriptorStringSerialNumber’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
main.c:105:14: error: variable ‘usbDescriptorHidReport’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
我的配置:
Ubuntu 13.10
avr-gcc(GCC)4.7.2
答案 0 :(得分:1)
usbdrv/
目录需要更新到最新版本。下载V-USB tarball或zip文件,并将项目的usbdrv/
替换为存档中的项目。您可能需要按一下项目的usbconfig.h
以使新的V-USB与现有项目一起工作,尽管大多数时候它应该可以工作。
答案 1 :(得分:1)
我知道这则帖子有些保留。但这可能会对某人有所帮助。
该错误的原因是新的 avr-gcc 需要 PROGMEM 为 const 。您只需要将const放在以PROGMEM开头的每一行的前面。
Sed 用sed -i 's/^PROGMEM/const PROGMEM/g' usbdrv/*
很好地解决了这个问题。
答案 2 :(得分:0)
你没有给出错误出现的代码,但只是看到错误信息,问题就很明显了
./usbdrv/usbdrv.h:455:6: error: variable ‘usbDescriptorDevice’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
你只能将常量放在只读部分(例如flash)。所有变量都转到RAM。因此,如果你想要“usbDescriptorDevice”(我不知道它做了什么)进入只读部分(因为你把“progrmem”),你应该声明它是常量。
问题通常出现在不符合此简单规则的旧库中。