Dev C++ SDL2,'main'的多重定义

问题描述 投票:0回答:0

我正在尝试让 SDL2 在 Dev-C++ 中工作。我从 GitHub 下载了 2.26.4 版本,这是最新的稳定版本。

我的项目中只有一个 .cpp 文件,但链接器抱怨发现了“main”的多个定义。

main.cpp:

#include "SDL.h"
#include <iostream>

int SDL_main(int argc, char *argv[])
{
  SDL_Init( SDL_INIT_EVERYTHING );

  SDL_Quit();

  return (0);
}

截图:

你可以在那里看到真正令人沮丧的事情:行和文件字段大部分是空白的。所以当它说“第一次定义在这里”时,它实际上并没有告诉我它第一次定义的地方......

但是编译日志更好:

make.exe -f "E:\Utilities\Dev-Cpp\Makefile.win" 全部 g++.exe -c Example_SDLtest1/main.cpp -o Example_SDLtest1/main.o -I"E:/Utilities/Dev-Cpp/include/c++/3.4.2/backward" -I"E:/Utilities/Dev-Cpp /include/c++/3.4.2/mingw32" -I"E:/Utilities/Dev-Cpp/include/c++/3.4.2" -I"E:/Utilities/Dev-Cpp/include" -I"C: /SDL/SDL2-2.26.4/include"
g++.exe Example_SDLtest1/main.o -o "Example_SDLtest1.exe" -L"E:/Utilities/Dev-Cpp/lib" -L"C:/SDL/SDL2-2.26.4/lib/x86" -mwindows - lmingw32 -lSDL2main -lSDL2
C:/SDL/SDL2-2.26.4/lib/x86\SDL2main.lib(Win32/Release/SDL_windows_main.obj)(.text$mn+0x0): `main' 的多重定义 E:/Utilities/Dev-Cpp/lib/libmingw32.a(main.o)(.text+0x0):main.c:首先在这里定义 collect2: ld 返回 1 退出状态 make.exe: *** [Example_SDLtest1.exe] 错误 1 执行终止

Makefile.win:

# Project: Example_SDLtest1
# Makefile created by Dev-C++ 4.9.9.2

CPP  = g++.exe
CC   = gcc.exe
WINDRES = windres.exe
RES  = 
OBJ  = Example_SDLtest1/main.o $(RES)
LINKOBJ  = Example_SDLtest1/main.o $(RES)
LIBS =  -L"E:/Utilities/Dev-Cpp/lib" -L"C:/SDL/SDL2-2.26.4/lib/x86" -mwindows -lmingw32 -lSDL2main -lSDL2  
INCS =  -I"E:/Utilities/Dev-Cpp/include" 
CXXINCS =  -I"E:/Utilities/Dev-Cpp/include/c++/3.4.2/backward"  -I"E:/Utilities/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"E:/Utilities/Dev-Cpp/include/c++/3.4.2"  -I"E:/Utilities/Dev-Cpp/include"  -I"C:/SDL/SDL2-2.26.4/include" 
BIN  = Example_SDLtest1.exe
CXXFLAGS = $(CXXINCS)  
CFLAGS = $(INCS)  
RM = rm -f

.PHONY: all all-before all-after clean clean-custom

all: all-before Example_SDLtest1.exe all-after


clean: clean-custom
    ${RM} $(OBJ) $(BIN)

$(BIN): $(OBJ)
    $(CPP) $(LINKOBJ) -o "Example_SDLtest1.exe" $(LIBS)

Example_SDLtest1/main.o: Example_SDLtest1/main.cpp
    $(CPP) -c Example_SDLtest1/main.cpp -o Example_SDLtest1/main.o $(CXXFLAGS)

我做了什么调查:

将“int main”重命名为“int SDL_main”或类似“main2”的任意名称。这并不能解决问题。

我切换了编译器和链接器的 32 位和 64 位版本,确保将 include 和 lib 文件夹指向正确的子文件夹。这不会产生任何不同的结果,除非 32/64 的东西不匹配。

我在 Dev-Cpp/Lib 文件夹中找到了 libmingw32.a 文件,但它的最后修改日期是 2005 年,所以我认为问题不在那里。但是我不知道如何打开和查看 .a 文件,所以 idk 肯定。

在项目选项的常规选项卡中,我尝试在 Win32 GUI 和 Win32 控制台类型之间切换,但这并没有改变任何错误消息。

我查看了 SDL.h,但我没有看到它在#defining main 或 SDL_main 的任何地方。然而,这个 .h 文件有很多其他包含,至少有 30 个,这就是为什么我真的希望日志能告诉我它的第一个 #define 位于何处......

但即使那样我也不明白到底该做什么。修改SDL2源文件?相反,我怀疑链接器或编译器的设置方式有问题,试图乱序或以某种方式获取错误的结构。

我也看过类似的 Stack Overflow 问题:herehere。最后一个有一个非常有前途的故障排除指南,我完整地阅读了它,但无法找到问题所在。

我知道 SDL 以某种方式抢占了您的 main,因为它想成为入口点,因此它可以配置东西,并以某种方式移交给您的“main”。如果是这样的话,我不明白为什么我不能把我的 main 重命名为任意的东西然后从那里开始。

好消息是,如果它是一个链接器错误,那么代码实际上可以编译,所以这个 SDL 东西连同我自己的代码显然可以独立运行。由于名称冲突,它不会链接在一起。我怀疑解决方案应该是解决冲突的一些非常简单的事情,但无法弄清楚。

c++ sdl-2 dev-c++
© www.soinside.com 2019 - 2024. All rights reserved.