You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

旧版dsgmLib库无法适配当前DevkitPro编译的问题求助

DS小游戏开发编译问题求助(dsgmLib库Collision示例)

重拾C/C++后,我把开发DS小游戏当作业余项目,在用dsgmLib库的Collision示例时编译失败,遇到两个问题:数组越界警告,以及DSGM_invalidObjectInstance符号重复定义的链接错误。

编译日志

make
project.c
In file included from C:/devkitPro/dsgmLib/examples/Collision/source/project.c:3:
C:/devkitPro/dsgmLib/include/DSGM_projectHelper.h: In function 'DSGM_BackgroundIsNitro':
C:/devkitPro/dsgmLib/include/DSGM_projectHelper.h:67:16: warning: array subscript background is outside array bounds of 'DSGM_Background[0]' [-Warray-bounds]
   67 |         return DSGM_BackgroundIsNitroFull(&DSGM_Backgrounds[background]);
      |                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:/devkitPro/dsgmLib/examples/Collision/source/project.c:12:17: note: while referencing 'DSGM_Backgrounds'
   12 | DSGM_Background DSGM_Backgrounds[DSGM_BACKGROUND_COUNT] = {
      |                 ^~~~~~~~~~~~~~~~
C:/devkitPro/dsgmLib/include/DSGM_projectHelper.h: In function 'DSGM_LoadBackground':
C:/devkitPro/dsgmLib/include/DSGM_projectHelper.h:72:28: warning: array subscript background is outside array bounds of 'DSGM_Background[0]' [-Warray-bounds]
   72 |         layer.background = &DSGM_Backgrounds[background];
      |                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:/devkitPro/dsgmLib/examples/Collision/source/project.c:12:17: note: while referencing 'DSGM_Backgrounds'
   12 | DSGM_Background DSGM_Backgrounds[DSGM_BACKGROUND_COUNT] = {
      |                 ^~~~~~~~~~~~~~~~
linking Collision.elf
c:/devkitpro/devkitarm/bin/../lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld.exe: C:/devkitPro/dsgmLib/lib\libdsgm.a(DSGM.o):C:/Users/gagef/Documents/git/dsgmLib/include/DSGM_object.h:75: multiple definition of `DSGM_invalidObjectInstance'; project.o:C:/devkitPro/dsgmLib/examples/Collision/source/project.c:9: first defined here
c:/devkitpro/devkitarm/bin/../lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld.exe: C:/devkitPro/dsgmLib/lib\libdsgm.a(DSGM_background.o):C:/Users/gagef/Documents/git/dsgmLib/include/DSGM_object.h:75: multiple definition of `DSGM_invalidObjectInstance'; project.o:C:/devkitPro/dsgmLib/examples/Collision/source/project.c:9: first defined here
c:/devkitpro/devkitarm/bin/../lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld.exe: C:/devkitPro/dsgmLib/lib\libdsgm.a(DSGM_file.o):C:/Users/gagef/Documents/git/dsgmLib/include/DSGM_object.h:75: multiple definition of `DSGM_invalidObjectInstance'; project.o:C:/devkitPro/dsgmLib/examples/Collision/source/project.c:9: first defined here
c:/devkitpro/devkitarm/bin/../lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld.exe: C:/devkitPro/dsgmLib/lib\libdsgm.a(DSGM_input.o):C:/Users/gagef/Documents/git/dsgmLib/include/DSGM_object.h:75: multiple definition of `DSGM_invalidObjectInstance'; project.o:C:/devkitPro/dsgmLib/examples/Collision/source/project.c:9: first defined here
c:/devkitpro/devkitarm/bin/../lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld.exe: C:/devkitPro/dsgmLib/lib\libdsgm.a(DSGM_largeBackground.o):C:/Users/gagef/Documents/git/dsgmLib/include/DSGM_object.h:75: multiple definition of `DSGM_invalidObjectInstance'; project.o:C:/devkitPro/dsgmLib/examples/Collision/source/project.c:9: first defined here
c:/devkitpro/devkitarm/bin/../lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld.exe: C:/devkitPro/dsgmLib/lib\libdsgm.a(DSGM_malloc.o):C:/Users/gagef/Documents/git/dsgmLib/include/DSGM_object.h:75: multiple definition of `DSGM_invalidObjectInstance'; project.o:C:/devkitPro/dsgmLib/examples/Collision/source/project.c:9: first defined here
c:/devkitpro/devkitarm/bin/../lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld.exe: C:/devkitPro/dsgmLib/lib\libdsgm.a(DSGM_object.o):C:/Users/gagef/Documents/git/dsgmLib/include/DSGM_object.h:75: multiple definition of `DSGM_invalidObjectInstance'; project.o:C:/devkitPro/dsgmLib/examples/Collision/source/project.c:9: first defined here
c:/devkitpro/devkitarm/bin/../lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld.exe: C:/devkitPro/dsgmLib/lib\libdsgm.a(DSGM_palette.o):C:/Users/gagef/Documents/git/dsgmLib/include/DSGM_object.h:75: multiple definition of `DSGM_invalidObjectInstance'; project.o:C:/devkitPro/dsgmLib/examples/Collision/source/project.c:9: first defined here
c:/devkitpro/devkitarm/bin/../lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld.exe: C:/devkitPro/dsgmLib/lib\libdsgm.a(DSGM_room.o):C:/Users/gagef/Documents/git/dsgmLib/include/DSGM_object.h:75: multiple definition of `DSGM_invalidObjectInstance'; project.o:C:/devkitPro/dsgmLib/examples/Collision/source/project.c:9: first defined here
c:/devkitpro/devkitarm/bin/../lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld.exe: C:/devkitPro/dsgmLib/lib\libdsgm.a(DSGM_sound.o):C:/Users/gagef/Documents/git/dsgmLib/include/DSGM_object.h:75: multiple definition of `DSGM_invalidObjectInstance'; project.o:C:/devkitPro/dsgmLib/examples/Collision/source/project.c:9: first defined here
c:/devkitpro/devkitarm/bin/../lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld.exe: C:/devkitPro/dsgmLib/lib\libdsgm.a(DSGM_sprite.o):C:/Users/gagef/Documents/git/dsgmLib/include/DSGM_object.h:75: multiple definition of `DSGM_invalidObjectInstance'; project.o:C:/devkitPro/dsgmLib/examples/Collision/source/project.c:9: first defined here
c:/devkitpro/devkitarm/bin/../lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld.exe: C:/devkitPro/dsgmLib/lib\libdsgm.a(DSGM_text.o):C:/Users/gagef/Documents/git/dsgmLib/include/DSGM_object.h:75: multiple definition of `DSGM_invalidObjectInstance'; project.o:C:/devkitPro/dsgmLib/examples/Collision/source/project.c:9: first defined here
c:/devkitpro/devkitarm/bin/../lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld.exe: C:/devkitPro/dsgmLib/lib\libdsgm.a(DGM_wireless.o):C:/Users/gagef/Documents/git/dsgmLib/include/DSGM_object.h:75: multiple definition of `DSGM_invalidObjectInstance'; project.o:C:/devkitPro/dsgmLib/examples/Collision/source/project.c:9: first defined here
c:/devkitpro/devkitarm/bin/../lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld.exe: C:/devkitPro/dsgmLib/lib\libdsgm.a(DSGM_drawable.o):C:/Users/gagef/Documents/git/dsgmLib/include/DSGM_object.h:75: multiple definition of `DSGM_invalidObjectInstance'; project.o:C:/devkitPro/dsgmLib/examples/Collision/source/project.c:9: first defined here
c:/devkitpro/devkitarm/bin/../lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld.exe: C:/devkitPro/dsgmLib/lib\libdsgm.a(DSGM_misc.o):C:/Users/gagef/Documents/git/dsgmLib/include/DSGM_object.h:75: multiple definition of `DSGM_invalidObjectInstance'; project.o:C:/devkitPro/dsgmLib/examples/Collision/source/project.c:9: first defined here
collect2.exe: error: ld returned 1 exit status
make[1]: *** [/opt/devkitpro/devkitARM/ds_rules:54: /c/devkitPro/dsgmLib/examples/Collision/Collision.elf] Error 1
make: *** [/opt/devkitpro/dsgmLib/DSGM_Makefile:124: build] Error 2

问题排查及相关代码

疑似问题出在DSGM_object.h文件,相关代码片段:

#pragma once

#define DSGM_NO_EVENT NULL

#define DSGM_DEFAULT_BITSHIFT 8

#define DSGM_ValidateObjectInstance(objectInstance); if(objectInstance == DSGM_invalidObjectInstance) {\
    DSGM_invalidObjectInstance = NULL;\
    continue;\
}

struct DSGM_objectInstance;

// ... Other stuff 

#include "DSGM_room.h"

extern void *me;
DSGM_ObjectInstance *DSGM_invalidObjectInstance;

// ... More stuff

DSGM_invalidObjectInstance仅在DSGM_object.c中被引用,查资料后仍无法理解编译失败原因,特此求助。


问题分析与解决方案

1. DSGM_invalidObjectInstance重复定义错误

  • 原因:头文件DSGM_object.h中直接定义了变量DSGM_ObjectInstance *DSGM_invalidObjectInstance;,而非用extern声明。每个包含该头文件的源文件(包括项目的project.c和库内的多个.c文件)都会生成这个变量的独立定义,链接时就会触发重复定义错误。
  • 解决步骤:
    1. 修改DSGM_object.h,将DSGM_ObjectInstance *DSGM_invalidObjectInstance;改为extern DSGM_ObjectInstance *DSGM_invalidObjectInstance;,只做变量声明,不分配内存。
    2. 在DSGM_object.c中添加变量定义:DSGM_ObjectInstance *DSGM_invalidObjectInstance;,确保整个项目中只有这一处定义。

2. 数组越界警告

  • 原因:DSGM_BACKGROUND_COUNT宏的值为0,导致DSGM_Backgrounds是长度为0的数组,但DSGM_projectHelper.h中的函数仍使用下标访问该数组,触发越界警告。
  • 解决步骤:
    1. 检查project.c中DSGM_BACKGROUND_COUNT的定义,确认其被设置为大于0的合理值(如果示例确实包含背景资源)。
    2. 如果项目确实不需要背景,修改DSGM_projectHelper.h中的DSGM_BackgroundIsNitro和DSGM_LoadBackground函数,添加数组长度判断,比如:
      // 在DSGM_BackgroundIsNitro中
      if(background < 0 || background >= DSGM_BACKGROUND_COUNT) return 0;
      // 在DSGM_LoadBackground中
      if(background < 0 || background >= DSGM_BACKGROUND_COUNT) return;
      

内容的提问来源于stack exchange,提问作者Gaëtan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:45:31