为啥 DevkitARM GBA 链接器会检测到多个定义?

Posted

技术标签:

【中文标题】为啥 DevkitARM GBA 链接器会检测到多个定义?【英文标题】:Why does DevkitARM GBA linker detect multiple definitions?为什么 DevkitARM GBA 链接器会检测到多个定义? 【发布时间】:2021-12-08 03:15:22 【问题描述】:

在 this code 上运行 make 以使用 DevkitARM 为 GBA 进行交叉编译,结果如下:

main.c
tilemap.c
linking cartridge
/opt/devkitpro/devkitARM/bin/../lib/gcc/arm-none-eabi/11.1.0/../../../../arm-none-eabi/bin/ld: tilemap.o:/home/shuffles/repos/_gba_dev/catsvsrats/include/raw/images/gui/map/tiles25.h:14: multiple definition of `TILES25_IMAGE'; main.o:/home/shuffles/repos/_gba_dev/catsvsrats/include/raw/images/gui/map/tiles25.h:14: first defined here
/opt/devkitpro/devkitARM/bin/../lib/gcc/arm-none-eabi/11.1.0/../../../../arm-none-eabi/bin/ld: tilemap.o:/home/shuffles/repos/_gba_dev/catsvsrats/include/raw/tilemap_data.h:11: multiple definition of `TILEMAP'; main.o:/home/shuffles/repos/_gba_dev/catsvsrats/include/raw/tilemap_data.h:11: first defined here
/opt/devkitpro/devkitARM/bin/../lib/gcc/arm-none-eabi/11.1.0/../../../../arm-none-eabi/bin/ld: tilemap.o:/home/shuffles/repos/_gba_dev/catsvsrats/include/raw/images/gui/map/tiles25.h:337: multiple definition of `TILES25_PALETTE'; main.o:/home/shuffles/repos/_gba_dev/catsvsrats/include/raw/images/gui/map/tiles25.h:337: first defined here
collect2: error: ld returned 1 exit status
make[1]: *** [/opt/devkitpro/devkitARM/gba_rules:25: /home/shuffles/repos/_gba_dev/catsvsrats/catsvsrats.elf] Error 1
make: *** [Makefile:121: build] Error 2

虽然链接器抱怨重复定义,但我在代码中没有发现任何内容,并且所有头文件都有#include 保护。任何信息都有帮助。

【问题讨论】:

【参考方案1】:

显然,您在多个来源中包含标题。标头保护只是防止同一个翻译单元中的多个定义/声明。每个生成的目标文件都将包含提到的变量,因此链接器通过给出错误是正确的。

不要在头文件中定义变量。在关联的源文件中定义它们,在您的情况下为“tiles25.c”。将该源添加到要编译和链接的源列表中。

头文件应该声明变量,为此使用关键字extern

/* tiles25.h */
/* ... */
extern const uint16_t TILES25_PALETTE[];
/* ... */
/* tiles25.c */
/* ... */
const uint16_t TILES25_PALETTE[] = 
;
/* ... */

【讨论】:

以上是关于为啥 DevkitARM GBA 链接器会检测到多个定义?的主要内容,如果未能解决你的问题,请参考以下文章

DevkitARM,模拟器上的白屏如果我在代码中使用for循环?

为啥useSelector里面的选择器会运行两次?

为啥终结器会有“严重的性能损失”?

为啥 Pycharm 的检查器会抱怨“d = ”?

为啥第 n 个子选择器会选择这些元素?

为啥 WEKA NaiveBayes 分类器会给出标准。开发。全零属性的值?