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 一起使用,而不能与 glfw 一起使用
4

2 回答 2

3

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

  • 我的系统中有两个版本的 glew32 -library,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 在库之后。

于 2013-05-10T10:09:04.237 回答
2

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

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

尝试用这个编译,我想它会工作。

于 2013-05-09T20:14:17.340 回答