我正在尝试交叉编译一个小型测试 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 一起使用,而不能与 glfw 一起使用