使用MinGW64 gcc构建GLFW - 入口符号警告&链接器错误

时间:2012-04-30 02:43:06

标签: gcc 64-bit mingw msys glfw

这是一个相当新鲜的Win7 64位安装,带有最新的MinGW64,在一个干净的(新提取的)GLFW 2.7.5源目录中调用它们的 make win32-msys 命令。

[A]构建库

#1 - gcc -c -I警告。 -I .. -Wall -mwin32 -O2 -o win32_init.o win32_init.c:

win32_init.c: In function '_glfwPlatformTerminate':
win32_init.c:353:27: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]

#2 - gcc -c -I警告。 -I .. -Wall -mwin32 -O2 -mdll -DGLFW_BUILD_DLL -D_GLFW_NO_DLOAD_GDI32 -D_GLFW_NO_DLOAD_WINMM -o win32_init_dll.o win32_init.c:

win32_init.c: In function '_glfwPlatformTerminate':
win32_init.c:353:27: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]

但相关的输出文件 do 在。\ lib \ win32:glfw.dll,libglfwdll.a和libglfw.a中创建。但是我担心那些可能会被破坏,因为我以后不可能通过gcc链接到它们 - 与本文中最后一篇描述的问题相同。

[B]构建示例

#3 - 在triangle.exe,pong3d.exe,splitview.exe,mipmaps.exe,gears.exe,boing.exe,wave.exe,heightmap.exe上发出警告:

c:/mingw64/x86_64-w64-mingw32/bin/ld.exe: warning: cannot find entry symbol _mainCRTStartup; defaulting to 0000000000401000

但是对于listmodes.exe,mthello.exe,mtbench.exe和particle.exe构建正常不是这样。事实上,这4个是之后唯一正常运行的,其他的只是立即退出而没有输出或错误(当然,因为它们没有有效的切入点)。

[C]构建测试

  1. 在accuracy.exe,dynamic.exe上发出警告:

    c:/mingw64/x86_64-w64-mingw32/bin/ld.exe: warning: cannot find entry symbol _mainCRTStartup; defaulting to 0000000000401000
    
  2. defaults.exe没有这样的问题。对于dynamic.exe,它会继续执行以下错误:

    C:\Users\roxor\AppData\Local\Temp\cc8hsorn.o:dynamic.c:(.text.startup+0x1c): undefined reference to `__imp_glfwGetVersion'
    C:\Users\roxor\AppData\Local\Temp\cc8hsorn.o:dynamic.c:(.text.startup+0x62): undefined reference to `__imp_glfwInit'
    C:\Users\roxor\AppData\Local\Temp\cc8hsorn.o:dynamic.c:(.text.startup+0xcf): undefined reference to `__imp_glfwOpenWindow'
    C:\Users\roxor\AppData\Local\Temp\cc8hsorn.o:dynamic.c:(.text.startup+0x10b): undefined reference to `__imp_glfwSetWindowTitle'
    C:\Users\roxor\AppData\Local\Temp\cc8hsorn.o:dynamic.c:(.text.startup+0x118): undefined reference to `__imp_glfwSetWindowSizeCallback'
    C:\Users\roxor\AppData\Local\Temp\cc8hsorn.o:dynamic.c:(.text.startup+0x123): undefined reference to `__imp_glfwSwapInterval'
    C:\Users\roxor\AppData\Local\Temp\cc8hsorn.o:dynamic.c:(.text.startup+0x14a): undefined reference to `__imp_glfwGetWindowParam'
    C:\Users\roxor\AppData\Local\Temp\cc8hsorn.o:dynamic.c:(.text.startup+0x151): undefined reference to `__imp_glfwSwapBuffers'
    C:\Users\roxor\AppData\Local\Temp\cc8hsorn.o:dynamic.c:(.text.startup+0x174): undefined reference to `__imp_glfwTerminate'
    collect2: ld returned 1 exit status
    make[1]: *** [dynamic.exe] Error 1
    make[1]: Leaving directory `/c/glfw64/tests'
    make: *** [win32-msys] Error 2
    

    现在后者是用于加载DLL的测试程序。您可能认为在正确的位置只是缺少必要的库(.a和.dll),但是请注意,在这一点上,我已经拥有了所有必需的包含和库(来自早期的GLFW,它是完全< / em>与上述相同,相同版本,相同警告,相同输出文件)在正确的位置:

    • libglfwdll.a位于\ MinGW64 \ x86_64-w64-mingw32 \ lib(libglu32.a旁边,libopengl32.a)
    • glfw.h in \ MinGW64 \ x86_64-w64-mingw32 \ include \ GL(gl.h,gla.h,glu.h)
    • \ windows和\ windows \ system32中的glfw.dll(opengl32.dll,glu32.dll旁边)

3 个答案:

答案 0 :(得分:3)

我也得到了同样的错误。 通过从

更改文件glfw-2.7.5\tests\Makefile.win32.mingw:12来解决此问题
SOLIB     = ../lib/win32/libglfwdll.a

SOLIB     = ../lib/win32/glfw.dll

答案 1 :(得分:3)

问题 A 是无害的,但我添加了额外的强制转换以删除警告。问题 B C 是由于GLFW中的两个错误造成的。它们现在已经修复,部分归功于这个主题。感谢您将其发布到GLFW错误跟踪器,从而引起我的注意。修复程序将包含在2.7.6版本中。在此之前,您可以从GLFW Subversion repository获取主干。

问题 C 非常棘手,无法解决有人可能会发现有用的摘要。

32位的正确链接需要带有__stdcall装饰符号的.def文件,但此文件不能用于64位。解决方案是让GCC为给定的体系结构生成正确的.def文件。

这是通过将DLL链接两次来完成的。首先它链接为导出__stdcall装饰符号(默认)并生成.def文件(使用-Wl,--output-def,file.def),然后再次链接而没有装饰(使用--kill-at)来生成最终的DLL 。然后可以像往常一样使用此生成的.def文件dlltool来生成导入库。

我在研究这个问题时发现的最有用的资源是Stdcall and DLL tools of MSVC and MinGW,其中概述了这种方法。

答案 2 :(得分:2)

我遇到了完全相同的问题,在研究错误和警告时,我找到了“无法找到条目符号错误”的修复警告:

在examples / Makefile.win32.msys和tests / Makefile.win32.msys中更改行

WINDOWS = -mwindows -e _mainCRTStartup

WINDOWS = -mwindows

Kabie的修复有助于动态链接错误

我不是100%确定这是一个正确的解决方案,因为我不是首先完全理解备用入口点名称的原因,但至少测试似乎有效并且示例运行。