【问题标题】:Undefined reference to `WinMain@16' minGW32-make error未定义对“WinMain@16”minGW32-make 错误的引用
【发布时间】:2016-04-07 11:57:49
【问题描述】:

我正在尝试在 Windows 上编译 GLFW 示例代码。如果我输入命令:

g++ main.cpp -Ideps/include/ -Ldeps/lib/ -lglfw3 -lopengl32 -lgdi32

直接进入命令提示符然后它编译得很好。但是我想使用 makefile,当我这样做时,我会得到以下输出。

g++ -g -Wall -Ideps/include/ -c main.cpp
g++ -Ldeps/lib/ -lglfw3_win32 -lopengl32 -lgdi32 -o main.o
c:/mingw/bin/../lib/gcc/mingw32/4.9.3/../../../libmingw32.a(main.o):(.text.startup+0xa7): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status
Makefile_WIN32:8: recipe for target 'test.exe' failed
mingw32-make: *** [test.exe] Error 1

我使用的makefile是

PROG = test.exe
CC = g++
CPPFLAGS = -g -Wall -Ideps/include/
LDFLAGS = -Ldeps/lib/ -lglfw3_win32 -lopengl32 -lgdi32
OBJS = main.o

$(PROG) : $(OBJS)
    $(CC) $(LDFLAGS) -o $(OBJS)

main.o :
    $(CC) $(CPPFLAGS) -c main.cpp

我正在使用命令调用它

mingw32-make -f Makefile_WIN32

我对 makefile 比较陌生,所以我不知道问题出在哪里,所以任何帮助都将不胜感激。我唯一的猜测是它不是源代码,因为它可以使用 g++ 命令编译好,并且在我的 mac(因此是非标准的 makefile 名称)上使用类似的 makefile。

【问题讨论】:

  • 你需要定义一个WinMain函数
  • 使用 -c 来阻止 g++ 尝试运行链接器。

标签: c++ makefile mingw glfw


【解决方案1】:

为什么链接时-o $(OBJS)?这应该是-o $(PROG) $(OBJS)。您正在尝试覆盖您的 main.o 文件而不是使用它...

编辑:此外,在没有 make 的情况下构建时,您不会使用相同的命令,您使用 -lglfw3 而在 makefile 中您使用 -lglfw3_win32

编辑 2(查看 cmets):有时需要在链接时将库标志放在目标之后,这给出:

$(CC)-o $(OBJS) $(LDFLAGS)

【讨论】:

  • 我不知道,我只是为了让它发挥作用而改变一些东西。但是,当我按照您的建议进行更改时,我会收到新的错误、对glfwInit 的未定义引用等。那是链接器错误是吗?知道为什么在使用 make 时找不到 GLFW 库文件,但是在一个命令中构建工作正常吗?
  • @Kieran Crayn 在没有 make 的情况下构建时您使用的命令不同,您使用 -lglfw3 而在 makefile 中使用 -lglfw3_win32
  • 我有两个 GLFW 库实例,libglfw3.a 和 libglfw3_win32.a,因为我想知道问题是否出在库文件中。在命令行中直接使用 g++ 构建适用于 *.a,但不适用于我的 Makefile
  • @Kieran Crayn 检查 shell 中的环境与 makefile 中的环境相同。在链接命令之前在您的 makefile 中添加以下命令:echo $(SHELL)echo $(PATH)where g++。与 cmd shell set Pathwhere g++ 中的命令进行比较。
  • 我发现问题出在我调用标志的顺序上。在库标志修复问题之前移动 main.o。
猜你喜欢
  • 2020-07-18
  • 2021-11-18
  • 2013-01-15
相关资源
最近更新 更多