2016-07-25 115 views
0

我正在尝试a program关于搅拌器变形。我的笔记本电脑是amd64,能够支持i386。OpenGL问题:'不兼容'vs'找不到'

[email protected]:/usr/bin$ dpkg --print-foreign-architectures 
i386 
[email protected]:/usr/bin$ dpkg --print-architecture 
amd64 

我对makefile脚本没有太多经验。根据谷歌搜索信息,我在makefile.mk中添加了两行代码。

# -I option to help the compiler finding the headers 
CFLAGS += $(addprefix -I, $(INCLUDE_PATH)) 
CC=gcc -m32 

这里是问题: 当我运行与任何模板的OpenGL代码:

gcc test.c -lm -lpthread -lglut -lGL -lGLU -o test 

似乎代码和库正常工作。

但是,如果我做同样的makefile.mk(CC = GCC),它提供了许多错误以下形式:

/usr/bin/ld: i386 architecture of input file `../external/lib/libxxxxxxxx.a(xxxxxxxx.o)' is incompatible with i386:x86-64 output 

如果我使用(CC = GCC -m32)时,错误将切换到:

/usr/bin/ld: cannot find -lglut 
/usr/bin/ld: cannot find -lGL 
/usr/bin/ld: cannot find -lGLU 

我想也许有一些错误在运行32位应用程序的64位操作系统和链接库?

回答

1

看起来像extenal/lib是充满了32位预编译的档案。你可能会跟踪每一个并重新编译(或使用共享库),但这将是一个庞大的PITA。

仅仅因为你的操作系统支持i386并不意味着你已经安装了库。在这个程序的情况下,安装libc6-dev-i386freeglut3-dev:i386软件包就足够了。 PS:不需要编辑任何东西。 make CC='gcc -m32'

2

-m32与x86-64编译器一起使用并不意味着“为i386编译该程序”,而实际上意味着“仅使用在32位寄存器上运行的指令创建x86-64 CPU的程序”。

你在那里有一些已经编译为本地i386的二进制文件,现在尝试将它与只用32位寄存器编译为x86-64的程序结合使用。这两个人不合。这里最大的问题当然是,你为什么要使用这些i386二进制文件。使用32位-x86-64(指针的一半大小可以大大减少内存带宽)有一些很好的理由,但通常情况下,您需要64位二进制文​​件。由于拥有大量的地址空间,32位内存管理的许多问题都消失了。