我正在尝试交叉编译一个小的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中使用?