未定义对 'main' 的引用

3
你得爱上链接错误 *讽刺*。无论如何,我正在使用pspsdk附带的allegro psp端开发psp游戏。在我修复了所有其他未定义的引用之后,这个错误让我无法继续。完整的错误消息、makefile和代码如下:

错误详情

1>------ Build started: Project: PSP Pong, Configuration: Debug Win32 ------
1>  psp-g++ -I. -IC:/pspsdk/psp/sdk/include -O2 -G0 -Wall -I. -IC:/pspsdk/psp/sdk/include -O2 -G0 -Wall -fno-exceptions -fno-rtti -D_PSP_FW_VERSION=150   -c -o main.o main.cpp
1>  psp-gcc -I. -IC:/pspsdk/psp/sdk/include -O2 -G0 -Wall -D_PSP_FW_VERSION=150  -L. -LC:/pspsdk/psp/sdk/lib   main.o -lalleg -lpspgu -lpspirkeyb -lm -lpsppower -lpspaudio -lpsprtc  -lpspdebug -lpspdisplay -lpspge -lpspctrl -lpspsdk -lc -lpspnet -lpspnet_inet -lpspnet_apctl -lpspnet_resolver -lpsputility -lpspuser -lpspkernel -o main.elf
1>  c:/pspsdk/bin/../lib/gcc/psp/4.3.5/../../../../psp/lib/crt0.o: In function `_main':
1>  ../../../../pspsdk/src/startup/crt0.c (86) : undefined reference to `main'
1>  C:\pspsdk\bin\make: *** [main.elf] Error 1
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

MakeFile

TARGET = main
OBJS = main.o

CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = PSP Pong
LIBS = -lalleg -lpspgu -lpspirkeyb -lm -lpsppower -lpspaudio -lpsprtc 
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

main.cpp

#include <allegro.h>
int main()
{

    allegro_init();
    install_mouse();

    set_color_depth(32);
    set_gfx_mode(GFX_AUTODETECT,480,272,0,0);

    clear_bitmap(screen);
    while (!(mouse_b & 2))
    {
        poll_mouse();
        putpixel(screen,mouse_x,mouse_y,0xFFFFFFFF);
        vsync();
    }
    clear_bitmap(screen);

    return 0;
}
END_OF_MAIN();

顺便提一下,我认为链接器并不是在谈论main.cpp中的主函数,而是其他的main函数,但我毫无头绪,所以任何建议,更正,或者帮助我解决问题的任何事情都将不胜感激。


2
END_OF_MAIN(); 展开成什么? - Ed S.
@Ed S. 所有 Allegro 游戏都需要使用 END_OF_MAIN() 函数。但是删除它不会改变链接器错误。 - Daniel Lopez
@sarnold 我已经尝试了 int main(int argc, char* argv[]),但它仍然显示相同的内容。我认为问题不在 main.cpp 中的 main 函数,而是在其他地方,但我毫无头绪。 - Daniel Lopez
crt0.c是C运行时入口点。 - Ed S.
我相信你需要“-lalleg-main”。 - Benjamin Lindley
所以显然 END_OF_MAIN() 是罪魁祸首... - Ed S.
3个回答

5

@EdS。然后链接到alleg-main。 - Benjamin Lindley

2

查看crt0.c源代码,它定义了一个main函数,但由于END_OF_MAIN()方法执行的名称混淆“魔法”,导致其无法访问该函数。

http://www.jbox.dk/sanos/source/lib/crt0.c.html

尝试在开头添加以下内容:

#define ALLEGRO_NO_MAGIC_MAIN


1

尝试将您的main函数定义更改为:

extern "C"
int main(int argc, char * argv[])

看看这是否有助于解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接