3

これは、最新のMinGW64を使用したかなり新しいバニラWin7 64ビットインストールで、 make win32-msysコマンドを呼び出すクリーンな(新しく抽出された)GLFW2.7.5ソースディレクトリにあります。

[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つだけがその後ここで適切に実行され、他の4つは出力やエラーなしですぐに終了します(当然、それらの有効なエントリポイントがないため)。

[C]テストの構築

  1. 精度.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

問題Aは無害ですが、警告を削除するためにキャストを追加しました。問題BCは、GLFWの2つのバグが原因です。このスレッドのおかげで、これらは修正されました。GLFWバグトラッカーに投稿してくれてありがとう。修正は2.7.6リリースに含まれます。それまでは、GLFWSubversionリポジトリからトランクを取得できます。

問題Cは、誰かが要約が役立つと思うかもしれないほど解決するのに十分トリッキーでした。

32ビットの適切なリンクには__stdcall装飾されたシンボルを含む.defファイルが必要ですが、このファイルは64ビットには使用できません。解決策は、GCCに特定のアーキテクチャ用の正しい.defファイルを生成させることでした。

これは、DLLを2回リンクすることによって行われます。最初に、__stdcall装飾されたシンボルのエクスポート(デフォルト)および.defファイルの生成(を使用-Wl,--output-def,file.def)としてリンクされ、次に装飾なしで(を使用して)再度リンクさ--kill-atれて、最終的なDLLが生成されます。この生成された.defファイルは、通常どおりにdlltoolインポートライブラリを生成するために使用できます。

これを調査しているときに見つけた最も有用なリソースは、MSVCおよびMinGWのStdcallおよびDLLツールであり、これらはとりわけこの方法の概要を示しています。

于 2012-07-02T20:52:49.517 に答える
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 に答える
2

私はまったく同じ問題に遭遇し、エラーと警告を調査しているときに、「エントリシンボルエラーが見つかりません」という警告の修正を見つけました。

examples/Makefile.win32.msysおよびtests/Makefile.win32.msysで、行を変更します

WINDOWS = -mwindows -e _mainCRTStartup

WINDOWS = -mwindows

Kabieの修正は、ダイナミックリンクエラーに役立ちます

そもそも代替エントリポイント名の理由を完全には理解していないため、これが正しい解決策であるかどうかは100%わかりませんが、少なくともテストは機能し、例は実行されているようです。

于 2012-05-29T19:46:15.740 に答える