【问题标题】:Trouble building GLEW on Windows using MinGW使用 MinGW 在 Windows 上构建 GLEW 时遇到问题
【发布时间】:2020-10-02 12:35:35
【问题描述】:

我正在尝试使用 MinGW 在 Windows (8.1) 上构建 GLEW 2.1.0,并且已经苦苦挣扎了一段时间。

我尝试按照GLEW GitHub page 上“MSYS/Mingw”的说明进行操作,但在运行mingw32-make 时,我只收到了一些关于缺少命令(testconfig)的错误以及以下错误:Makefile:40: *** "Platform '' not supported". Stop.

在“要求”下,它说需要 bash,所以我安装了git,因为它显然带有一个 bash 版本。使用 Git Bash 运行 mingw32-make(在所有 GLEW 文件和文件夹所在的目录中)会导致一长串警告和“未定义的引用”。据我所知,后者来自链接器,但我不知道是什么导致了它们。由于文字太多,我这里只包括最后几行:

c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: tmp/mingw/default/shared/glewinfo.o:glewinfo.c:(.text.startup+0x181b): undefined reference to `_imp___iob'
collect2.exe: error: ld returned 1 exit status
Makefile:181: recipe for target 'bin/glewinfo.exe' failed
mingw32-make: *** [bin/glewinfo.exe] Error 1

mingw32-make install 有以下输出:

$ mingw32-make install
install -d -m 0755 "/usr/include/GL"
install -m 0644 include/GL/wglew.h "/usr/include/GL/"
install -m 0644 include/GL/glew.h "/usr/include/GL/"
install -m 0644 include/GL/glxew.h "/usr/include/GL/"
sed \
        -e "s|@prefix@|/usr|g" \
        -e "s|@libdir@|/usr/lib|g" \
        -e "s|@exec_prefix@|/usr/bin|g" \
        -e "s|@includedir@|/usr/include/GL|g" \
        -e "s|@version@|2.1.0|g" \
        -e "s|@cflags@||g" \
        -e "s|@libname@|glew32|g" \
        -e "s|@requireslib@|glu|g" \
        < glew.pc.in > glew.pc
install -d -m 0755 "/usr/lib"
install -d -m 0755 "/usr/bin"
install -m 0755 lib/glew32.dll "/usr/bin/"
install -m 0644 lib/libglew32.dll.a    "/usr/lib/"
install -m 0644 lib/libglew32.a        "/usr/lib/"
install -d -m 0755 "/usr/lib/pkgconfig"
install -d -m 0755 "/usr/lib/pkgconfig"
install -m 0644 glew.pc "/usr/lib/pkgconfig/"

而 mingw32-make install.all 会产生另一个长长的未定义引用列表,以及运行 mingw32-make 时出现的相同错误。然而,第一行与运行 mingw32-make install 的结果(大约)相同。

正如预期的所有错误一样,运行这些命令并没有生成二进制文件。我想这可能与我没有 make 有关,这是 GitHub 页面上列出的要求之一。但是我不明白我应该如何在 Windows 上安装 make 以及为什么当说明说要使用 mingw32-make 时甚至需要它。

我也尝试了this 线程中提出的一些建议,但似乎也没有奏效。

可能是什么问题,我该怎么做才能成功编译 GLEW?

【问题讨论】:

    标签: c++ windows opengl mingw glew


    【解决方案1】:

    我永远无法按照我在互联网上找到的说明构建它,所以这是我在 MSYS2 下使用 MinGW-w64 构建 glew(使用 https://downloads.sourceforge.net/project/glew/glew/2.2.0/glew-2.2.0.tgz)的方法:

    # change the line below to your desired install path
    INSTALLPREFIX=/usr/local
    VERSION=2.2.0
    gcc -O2 -Wall -W -Iinclude -DGLEW_BUILD -o src/glew.o -c src/glew.c &&
    gcc -fno-builtin -fno-stack-protector -shared -s -Wl,-soname,libglew32.dll -Wl,--out-implib,lib/libglew32.dll.a -o lib/glew32.dll src/glew.o -Wl,--as-needed -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32 -nostdlib &&
    ar cr lib/libglew32.a src/glew.o &&
    gcc -DGLEW_MX -O2 -Wall -W -Iinclude -DGLEW_BUILD -o src/glew.mx.o -c src/glew.c &&
    gcc -fno-builtin -fno-stack-protector -shared -s -Wl,-soname,libglew32mx.dll -Wl,--out-implib,lib/libglew32mx.dll.a -o lib/glew32mx.dll src/glew.mx.o -Wl,--as-needed -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32 -nostdlib &&
    ar cr lib/libglew32mx.a src/glew.mx.o &&
    gcc -O2 -c -Iinclude -o src/glewinfo.o src/glewinfo.c &&
    gcc -s -o src/glewinfo.exe src/glewinfo.o lib/libglew32.dll.a -Wl,--as-needed -lgdi32 -lopengl32 &&
    gcc -O2 -c -Iinclude -o src/visualinfo.o src/visualinfo.c &&
    gcc -s -o src/visualinfo.exe src/visualinfo.o lib/libglew32.dll.a -Wl,--as-needed -lgdi32 -lopengl32 -lglu32 &&
    sed -e "s?@prefix@?$INSTALLPREFIX?; s?@libdir@?\$\{prefix\}/lib?; s?@version@?$VERSION?; s?@requireslib@?glu?; s?@cflags@??; s?@libname@?glew32?" glew.pc.in > glew.pc &&
    sed -e "s?@prefix@?$INSTALLPREFIX?; s?@libdir@?\$\{prefix\}/lib?; s?@version@?$VERSION?; s?@requireslib@?glu?; s?@cflags@?-DGLEW_MX?; s?@libname@?glew32mx?" glew.pc.in > glewmx.pc &&
    echo Installing... &&
    mkdir -p $INSTALLPREFIX/include $INSTALLPREFIX/lib/pkgconfig $INSTALLPREFIX/bin $INSTALLPREFIX/cmake &&
    cp -rf include/GL $INSTALLPREFIX/include/ &&
    cp -f lib/*.a $INSTALLPREFIX/lib/ &&
    cp -f *.pc $INSTALLPREFIX/lib/pkgconfig/ &&
    cp -f lib/*.dll src/*.exe $INSTALLPREFIX/bin/ &&
    cp -f build/cmake/*.cmake $INSTALLPREFIX/cmake/ &&
    echo Success
    

    【讨论】:

    • 谢谢!使用 DLL(bin/glew32.dll 或 lib/libglew32.dll.a)编译似乎可以正常工作,但是使用 lib/libglew32.a 编译时,我收到关于我在我的 GLEW 函数中使用的“未定义引用”错误程序。还有,为什么会有两个DLL,一个在bin,一个在lib?
    • @gearmic 只有一个.dllbin/glew32.dll,您提到的另一个文件是.a 文件,用于链接您的共享项目:lib/libglew32.dll.a(相对于静态库@ 987654327@)。同时拥有 .dll.a.a 文件允许 gcc 在与 -lglew32 链接时选择正确的文件,具体取决于您的构建是静态的还是共享的
    • 那么bin/glew32.dll 是干什么用的,如果你可以用lib/libglew32.dll.a 来构建共​​享呢?
    • bin/glew32.dll 是运行时需要的 DLL 文件,您需要将其与 EXE 文件一起分发。 lib/libglew32.dll.a 是要链接的库,它引用 DLL 并告诉链接器哪些符号由 DLL 导出。
    • 谢谢,我觉得现在说得通了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多