这是一个相当新鲜的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]构建测试
在accuracy.exe,dynamic.exe上发出警告:
c:/mingw64/x86_64-w64-mingw32/bin/ld.exe: warning: cannot find entry symbol _mainCRTStartup; defaulting to 0000000000401000
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>与上述相同,相同版本,相同警告,相同输出文件)在正确的位置:
答案 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%确定这是一个正确的解决方案,因为我不是首先完全理解备用入口点名称的原因,但至少测试似乎有效并且示例运行。