在Linux上为Windows交叉编译OpenGL/glew

4

我正在尝试交叉编译一个小的OpenGL/GLEW测试程序,但出现了未定义引用的链接器错误。

$ /usr/bin/i486-mingw32-g++ -I/usr/i486-mingw32/include -L/usr/i486-mingw32/lib/ -lglfw -lglew32 -lopengl32 main.cc
/tmp/cct8OpVh.o:main.cc:(.text+0x50): undefined reference to `glfwInit'
/tmp/cct8OpVh.o:main.cc:(.text+0xa6): undefined reference to `glfwOpenWindowHint'
...

相同的代码在编译 Linux 时可以正常工作:
$ g++ -I/usr/include -L/usr/lib/ -lglfw -lGLEW -lGL main.cc

有一件事引起了我的注意,那就是从交叉编译的库中导出的每个符号都有一个额外的下划线前缀:

$ nm /usr/lib/libglfw.a | grep glfwInit$
00000000 T glfwInit

$ /usr/i486-mingw32/bin/nm /usr/i486-mingw32/lib/libglfw.a | grep glfwInit$
00000000 T _glfwInit

这似乎是一个常见的问题,因为即使libstdc++.a也具有这种属性,但为什么我的交叉编译器链接器还在寻找非下划线符号呢?

使用以下软件包运行arch(本地表示AUR):

community/mingw32-binutils 2.23.1-3
community/mingw32-gcc 4.7.2-1
local/mingw32-glew 1.9.0-1
local/mingw32-glfw 2.7.7-1
community/mingw32-pthreads 2.9.1-1
community/mingw32-runtime 3.20-4
community/mingw32-w32api 3.17-1

编辑

在尝试使用pkg-config并观察glfw重新编译和测试后,我想出了以下的方法,似乎能够成功编译:

 /usr/bin/i486-mingw32-g++ -I/usr/i486-mingw32/include -L/usr/i486-mingw32/lib -mwindows main.cc -lglew32 /usr/i486-mingw32/lib/libglfw.a /usr/i486-mingw32/lib/libopengl32.a -static-libgcc

然而,还有一些问题:

  • -l和不使用-l之间的区别是什么?
  • 为什么我需要在glew中使用-l而不能在glfw中使用?
2个回答

3

我解决了我的问题,并且希望如果有人遇到类似的情况,这能对你有所帮助。

  • 我的系统中有两个版本的glew32库:glew32.a和glew32.dll.a。
    • glew32.a不允许使用--static选项,而glew32.dll.a允许。

下面是编译成功的两个命令,只有第一个我运行了:

/usr/bin/i486-mingw32-g++ -I/usr/i486-mingw32/include -L/usr/i486-mingw32/lib main.cc -lglew32.dll -lglfw -lopengl32 --static
/usr/bin/i486-mingw32-g++ -I/usr/i486-mingw32/include -L/usr/i486-mingw32/lib main.cc -lglew32 -lglfw -lopengl32

从我的以往编译尝试来看,问题在于库的顺序错误,并且main.cc是放在库之后的。


2

有一个名为pkg-config的程序可以帮助您配置编译器。有关使用信息,请参阅手册页面,但是对于这种情况,它的输出如下:

-mwin32 -I/usr/i486-mingw32/include -L/usr/i486-mingw32/lib -lglfw -lglu32 -lopengl32 -lm -s -mwindows -e _mainCRTStartup

尝试使用此选项进行编译,我想它会奏效。


虽然这不是答案,但它确实指引我找到了能够推动我进一步的正确工具。如果你能继续帮助我,请查看编辑部分。 - shiona

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接