3

这是一个相当新鲜的香草 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]

但相关的输出文件确实在 .\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 和particles.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
    

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 制作与以上,相同的版本,相同的警告,相同的输出文件)在正确的地方:

  • \MinGW64\x86_64-w64-mingw32\lib 中的 libglfwdll.a(在 libglu32.a、libopengl32.a 旁边)
  • \MinGW64\x86_64-w64-mingw32\include\GL 中的 glfw.h(gl.h、glaux.h、glu.h 旁边)
  • \windows 和 \windows\system32 中的 glfw.dll(在 opengl32.dll、glu32.dll 旁边)
4

3 回答 3

3

我也遇到了同样的错误。通过更改文件解决glfw-2.7.5\tests\Makefile.win32.mingw:12 从

SOLIB     = ../lib/win32/libglfwdll.a

SOLIB     = ../lib/win32/glfw.dll
于 2012-05-12T09:48:15.417 回答
3

问题A是无害的,但我添加了一个额外的演员来删除警告。问题BC是由于 GLFW 中的两个错误造成的。它们现在已经得到修复,部分归功于这个线程。感谢您将其发布到 GLFW 错误跟踪器,让我注意到它们。修复程序将包含在 2.7.6 版本中。在此之前,您可以从GLFW Subversion 存储库中获取主干。

问题C非常棘手,以至于有人可能会发现总结很有用。

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

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

我在研究这个时发现的最有用的资源是 MSVC 和 MinGW 的 Stdcall 和 DLL 工具,其中概述了这种方法。

于 2012-07-02T20:52:49.517 回答
2

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

在示例/Makefile.win32.msys 和测试/Makefile.win32.msys 中更改该行

WINDOWS = -mwindows -e _mainCRTStartup

WINDOWS = -mwindows

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

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

于 2012-05-29T19:46:15.740 回答