我需要帮助,试图用MinGW编译GLFW的简单例子

我想从GLFW的文档中编译一个例子。

我的文件夹和源文件的文件夹结构是:

C:\ CPP \

glfw3.dll glfw3dll.a libglfw3.a test.cpp

包括\

GLFW \

glfw3.h glfw3native.h

#include <GLFW/glfw3.h> int main(void) { GLFWwindow* window; /* Initialize the library */ if (!glfwInit()) return -1; /* Create a windowed mode window and its OpenGL context */ window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL); if (!window) { glfwTerminate(); return -1; } /* Make the window's context current */ glfwMakeContextCurrent(window); /* Loop until the user closes the window */ while (!glfwWindowShouldClose(window)) { /* Render here */ /* Swap front and back buffers */ glfwSwapBuffers(window); /* Poll for and process events */ glfwPollEvents(); } glfwTerminate(); return 0; } 

我试图用这个命令编译它

 c:\cpp>x86_64-w64-mingw32-g++ -lglfw3 -Iinclude test.cpp -o test 

但我得到这个错误:

 c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lglfw3 collect2.exe: error: ld returned 1 exit status 

-v输出:

 Using built-in specs. COLLECT_GCC=x86_64-w64-mingw32-g++ COLLECT_LTO_WRAPPER=c:/users/username/gcc/bin/../libexec/gcc/x86_64-w64-ming w32/4.7.2/lto-wrapper.exe Target: x86_64-w64-mingw32 Configured with: ../gcc-4.7.2-mingw/configure --host=x86_64-w64-mingw32 --build= x86_64-unknown-linux-gnu --target=x86_64-w64-mingw32 --prefix=/home/gfortran/gcc -home/binary/mingw32/native/x86_64/gcc/4.7.2 --with-sysroot=/home/gfortran/gcc-h ome/binary/mingw32/cross/x86_64/gcc/4.7.2 --with-gcc --with-gnu-ld --with-gnu-as --with-gmp=/home/gfortran/gcc-home/binary/mingw32/native/x86_64/gmp --with-mpfr =/home/gfortran/gcc-home/binary/mingw32/native/x86_64/mpfr --with-mpc=/home/gfor tran/gcc-home/binary/mingw32/native/x86_64/mpc --with-cloog=/home/gfortran/gcc-h ome/binary/mingw32/native/x86_64/cloog --with-ppl=/home/gfortran/gcc-home/binary /mingw32/native/x86_64/ppl --with-host-libstdcxx='-lstdc++ -lsupc++ -lm' --enabl e-cloog-backend=ppl --enable-targets=i686-w64-mingw32,x86_64-w64-mingw32 --enabl e-lto --enable-languages=c,c++,fortran --enable-libgomp --enable-threads=win32 - -enable-static --enable-shared=lto-plugin --enable-plugins --enable-ld=yes --ena ble-libquadmath --enable-libquadmath-support --disable-nls --disable-tls --disab le-win32-registry Thread model: win32 gcc version 4.7.2 (GCC) COLLECT_GCC_OPTIONS='-I' 'include' '-o' 'test.exe' '-v' '-mtune=generic' '-march =x86-64' c:/users/username/gcc/bin/../libexec/gcc/x86_64-w64-mingw32/4.7.2/cc1plus.e xe -quiet -v -I include -iprefix c:\users\username\gcc\bin\../lib/gcc/x86_64 -w64-mingw32/4.7.2/ -U_REENTRANT test.cpp -quiet -dumpbase test.cpp -mtune=gener ic -march=x86-64 -auxbase test -version -o C:\Users\username~1.ADM\AppData\Local\T emp\ccfe85gV.s GNU C++ (GCC) version 4.7.2 (x86_64-w64-mingw32) compiled by GNU C version 4.7.2, GMP version 5.0.5, MPFR version 3.0.0, MPC version 0.9 warning: GMP header version 5.0.5 differs from library version 5.0.1. GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 ignoring duplicate directory "c:/users/username/gcc/lib/gcc/../../lib/gcc/x8 6_64-w64-mingw32/4.7.2/../../../../include/c++/4.7.2" ignoring duplicate directory "c:/users/username/gcc/lib/gcc/../../lib/gcc/x8 6_64-w64-mingw32/4.7.2/../../../../include/c++/4.7.2/x86_64-w64-mingw32" ignoring duplicate directory "c:/users/username/gcc/lib/gcc/../../lib/gcc/x8 6_64-w64-mingw32/4.7.2/../../../../include/c++/4.7.2/backward" ignoring duplicate directory "c:/users/username/gcc/lib/gcc/../../lib/gcc/x8 6_64-w64-mingw32/4.7.2/include" ignoring nonexistent directory "/home/gfortran/gcc-home/binary/mingw32/cross/x86 _64/gcc/4.7.2/home/gfortran/gcc-home/binary/mingw32/native/x86_64/gcc/4.7.2/lib/ gcc/x86_64-w64-mingw32/4.7.2/../../../../include" ignoring duplicate directory "c:/users/username/gcc/lib/gcc/../../lib/gcc/x8 6_64-w64-mingw32/4.7.2/include-fixed" ignoring duplicate directory "c:/users/username/gcc/lib/gcc/../../lib/gcc/x8 6_64-w64-mingw32/4.7.2/../../../../x86_64-w64-mingw32/include" ignoring nonexistent directory "/home/gfortran/gcc-home/binary/mingw32/cross/x86 _64/gcc/4.7.2/mingw/include" #include "..." search starts here: #include <...> search starts here: include c:\users\username\gcc\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../i nclude/c++/4.7.2 c:\users\username\gcc\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../i nclude/c++/4.7.2/x86_64-w64-mingw32 c:\users\username\gcc\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../i nclude/c++/4.7.2/backward c:\users\username\gcc\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/include c:\users\username\gcc\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/include-fixed c:\users\username\gcc\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x 86_64-w64-mingw32/include End of search list. GNU C++ (GCC) version 4.7.2 (x86_64-w64-mingw32) compiled by GNU C version 4.7.2, GMP version 5.0.5, MPFR version 3.0.0, MPC version 0.9 warning: GMP header version 5.0.5 differs from library version 5.0.1. GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: 0b3cd9e378660c38a8a80567400ff92f COLLECT_GCC_OPTIONS='-I' 'include' '-o' 'test.exe' '-v' '-mtune=generic' '-march =x86-64' c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x 86_64-w64-mingw32/bin/as.exe -v -I include -o C:\Users\username~1.ADM\AppData\Loca l\Temp\ccQqklHV.o C:\Users\username~1.ADM\AppData\Local\Temp\ccfe85gV.s GNU assembler version 2.22.52 (x86_64-w64-mingw32) using BFD version (GNU Binuti ls) 2.22.52.20120723 COMPILER_PATH=c:/users/username/gcc/bin/../libexec/gcc/x86_64-w64-mingw32/4. 7.2/;c:/users/username/gcc/bin/../libexec/gcc/;c:/users/username/gcc/bin /../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x86_64-w64-mingw32/bin/ EQ_LIBRARY_PATH=c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7. 2/;c:/users/username/gcc/bin/../lib/gcc/;C:/Users/username/gcc/x86_64-w6 4-mingw32/lib/../lib/;c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw3 2/4.7.2/../../../../x86_64-w64-mingw32/lib/../lib/;c:/users/username/gcc/bin /../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../lib/;C:/Users/username/gcc/ x86_64-w64-mingw32/lib/;c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-ming w32/4.7.2/../../../../x86_64-w64-mingw32/lib/;c:/users/username/gcc/bin/../l ib/gcc/x86_64-w64-mingw32/4.7.2/../../../ COLLECT_GCC_OPTIONS='-I' 'include' '-o' 'test.exe' '-v' '-mtune=generic' '-march =x86-64' c:/users/username/gcc/bin/../libexec/gcc/x86_64-w64-mingw32/4.7.2/collect2. exe --sysroot=/home/gfortran/gcc-home/binary/mingw32/cross/x86_64/gcc/4.7.2 -mi 386pep -Bdynamic -o test.exe C:/Users/username/gcc/x86_64-w64-mingw32/lib/.. /lib/crt2.o C:/Users/username/gcc/x86_64-w64-mingw32/lib/../lib/crtbegin.o - Lc:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2 -Lc:/users/ username/gcc/bin/../lib/gcc -LC:/Users/username/gcc/x86_64-w64-mingw32/lib /../lib -Lc:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../. ./../../x86_64-w64-mingw32/lib/../lib -Lc:/users/username/gcc/bin/../lib/gcc /x86_64-w64-mingw32/4.7.2/../../../../lib -LC:/Users/username/gcc/x86_64-w64 -mingw32/lib -Lc:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2 /../../../../x86_64-w64-mingw32/lib -Lc:/users/username/gcc/bin/../lib/gcc/x 86_64-w64-mingw32/4.7.2/../../.. C:\Users\username~1.ADM\AppData\Local\Temp\ccQqkl HV.o -lglfw3 -lstdc++ -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt -ladvapi32 - lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt C:/Us ers/username/gcc/x86_64-w64-mingw32/lib/../lib/crtend.o c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 6_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/users/username/gcc/bin /../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../lib/libglfw3.a when searching f or -lglfw3 c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 6_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/users/username/gcc/bin /../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../lib/glfw3.dll when searching fo r -lglfw3 c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 6_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/users/username/gcc/bin /../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../lib\libglfw3.a when searching f or -lglfw3 c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 6_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/users/username/gcc/bin /../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../libglfw3.a when searching for -lgl fw3 c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 6_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/users/username/gcc/bin /../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../glfw3.dll when searching for -lglf w3 c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 6_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/users/username/gcc/bin /../lib/gcc/x86_64-w64-mingw32/4.7.2/../../..\libglfw3.a when searching for -lgl fw3 c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 6_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/users/username/gcc/bin /../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../lib/libglfw3.a when searching f or -lglfw3 c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 6_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/users/username/gcc/bin /../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../lib/glfw3.dll when searching fo r -lglfw3 c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 6_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/users/username/gcc/bin /../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../libglfw3.a when searching for -lgl fw3 c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 6_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/users/username/gcc/bin /../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../glfw3.dll when searching for -lglf w3 c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 6_64-w64-mingw32/bin/ld.exe: cannot find -lglfw3 collect2.exe: error: ld returned 1 exit status 

c:\ cpp> x86_64-w64-mingw32-g ++ -Iinclude test.cpp -o test。\ glfw3.dll

 c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 6_64-w64-mingw32/bin/ld.exe: i386 architecture of input file `.\glfw3.dll' is in compatible with i386:x86-64 output C:\Users\username~1.ADM\AppData\Local\Temp\cceVroaP.o:test.cpp:(.text+0xe): undefi ned reference to `glfwInit' C:\Users\username~1.ADM\AppData\Local\Temp\cceVroaP.o:test.cpp:(.text+0x43): undef ined reference to `glfwCreateWindow' C:\Users\username~1.ADM\AppData\Local\Temp\cceVroaP.o:test.cpp:(.text+0x53): undef ined reference to `glfwTerminate' C:\Users\username~1.ADM\AppData\Local\Temp\cceVroaP.o:test.cpp:(.text+0x66): undef ined reference to `glfwMakeContextCurrent' C:\Users\username~1.ADM\AppData\Local\Temp\cceVroaP.o:test.cpp:(.text+0x74): undef ined reference to `glfwSwapBuffers' C:\Users\username~1.ADM\AppData\Local\Temp\cceVroaP.o:test.cpp:(.text+0x79): undef ined reference to `glfwPollEvents' C:\Users\username~1.ADM\AppData\Local\Temp\cceVroaP.o:test.cpp:(.text+0x85): undef ined reference to `glfwWindowShouldClose' C:\Users\username~1.ADM\AppData\Local\Temp\cceVroaP.o:test.cpp:(.text+0x93): undef ined reference to `glfwTerminate' c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 6_64-w64-mingw32/bin/ld.exe: C:\Users\username~1.ADM\AppData\Local\Temp\cceVroaP.o : bad reloc address 0x0 in section `.pdata' c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 6_64-w64-mingw32/bin/ld.exe: final link failed: Invalid operation collect2.exe: error: ld returned 1 exit status 

库在命令行中出现的顺序对于gcc以及库搜索路径来说很重要。尝试将-lglfw3移动到最后,并使用-L将当前目录添加到搜索路径。

例如。

 g++ -Iinclude test.cpp -o test.exe -L . -lglfw3 

编辑1:从详细的状态输出看来,你似乎libglfw3.a与你正在使用的mingw gcc不兼容。 幸运的是, ld链接器可以直接使用dll文件。 看下面的工作:

 g++ -Iinclude test.cpp -o test.exe .\glfw3.dll 

另一种方法是使用mingw gcc从glfw3.dll创建一个导入库。 这有点多,因为你需要创建一个.def文件,然后调用dlltool。

编辑2:你正在使用的mingw gcc是一个64位的Windows编译器。 确保您使用的是正确的glfw3 64位库而不是 32位版本。 GLFW下载部分

我认为你有一个命名问题。 看来Mingw32编译器正在寻找库文件glfw3.dll,glfw3.a和glfw3.h。 问题是你的库文件名为libglfw3.a。 现在你需要把它重命名为glfw3.a,以便它能够找到它。 如果仍然不起作用,则需要将glfw3dll.a重命名为glfw3.dll.a