我一直在尝试在 64 位 RedHat 4 机器下编译 GLEW-1.9.0 的 32 位共享库,但似乎无论我尝试什么,它产生的共享库都是 64 位的(这是确定的)在输出目录中使用“file libGLEW*”)。
GLEW 似乎有自己的体系结构检测系统。最终,这归结为“shell uname -m”,我尝试使用“setarch i386”对其进行更改。调用后“uname -m”的输出是“i686”,它不是 i386,但仍应为 32 位。
在我的 32 位构建之前,我一直将 CFLAGS.EXTRA 设置为“-m32 -Wl,-rpath,$(APPDIR32)/lib -fPIC”,其中 $(APPDIR32) 也是我要输出到的目录作为我链接库的地方。这对我的 64 位版本非常有效(字符串中的 '32' 替换为 '64' 除外)。
我一直在使用 GLEW 的 Makefile 如下(在设置了上面提到的变量以及其他不太相关的变量之后):“make -f Makefile all”
将 LDFLAGS 设置为 -m32 或 melf_i386 对输出文件的格式没有影响,它总是以 ELF_64(而不是 ELF_32)结束。被链接的库都是 32 位的,这就是它抱怨的原因之一,如下所述。
在构建过程中,我收到重复的警告,如下所示...
/usr/bin/ld: warning: i386 architecture of input file `tmp/linux/default/shared/glew.o' is incompatible with i386:x86-64 output
一个问题:i686 是 32 位架构吗?维基百科页面对此不清楚。我在该页面中发现了一个点,它说某些 i686 处理器支持 64 位指令集。
另一个问题:我还没有找到任何关于在 64 位环境中为 GLEW 构建 32 位共享库的有用信息。你能给我任何指示吗?
最后一个问题:你能看出我哪里出错了吗,或者你知道我需要采取什么额外的措施来构建一个 32 位共享库吗?
为了响应有关上述警告的确切命令行及其输出的信息请求,如下...
cc -shared -Wl,-soname=libGLEW.so.1.9 -o lib/libGLEW.so.1.9.0 tmp/linux/default/shared/glew.o -L/usr/X11R6/lib -L/usr/lib -lXmu -lXi -lGL -lXext -lX11
/usr/bin/ld: skipping incompatible /usr/lib/libXmu.so when searching for -lXmu
/usr/bin/ld: skipping incompatible /usr/lib/libXi.so when searching for -lXi
/usr/bin/ld: skipping incompatible /usr/lib/libGL.so when searching for -lGL
/usr/bin/ld: skipping incompatible /usr/lib/libXext.so when searching for -lXext
/usr/bin/ld: skipping incompatible /usr/lib/libX11.so when searching for -lX11
/usr/bin/ld: skipping incompatible /usr/lib/libc.so when searching for -lc
/usr/bin/ld: skipping incompatible /usr/lib/libc.a when searching for -lc
/usr/bin/ld: warning: i386 architecture of input file `tmp/linux/default/shared/glew.o' is incompatible with i386:x86-64 output
这是我的 makefile,以防你真的很兴奋并想要更多材料。如果你把这个 makefile 放在与 GLEW-1.9.0 的 Makefile 相同的目录中(直到你尝试 configure32),这个 makefile 就可以正常工作。只要确保设置 TOPDIR。使用'make -f clean'、'make -f configure32'、'make -f all'、'make -f install'。
APPLICATION = glew
VERSION = 1.9.0
FULLAPPLICATION = $(APPLICATION)-$(VERSION)
TOPDIR = /home/<username>/dev/project/third-party
APPDIRROOT = $(TOPDIR)/apps-miles
ARCH=$(shell uname | sed -e 's/-//g')
SHELL = /bin/csh
MACHTYPE32= i386
APPDIR32 = $(APPDIRROOT)/$(ARCH)_$(MACHTYPE32)
MACHTYPE64= x86_64
APPDIR64 = $(APPDIRROOT)/$(ARCH)_$(MACHTYPE64)
#
# Linux
#
ifeq ($(ARCH), Linux)
CC = gcc
CXX = g++
CFLAGS.EXTRA32 += -m32 -Wl,-rpath,$(APPDIR32)/lib -fPIC
CFLAGS.EXTRA64 += -m64 -Wl,-rpath,$(APPDIR64)/lib -fPIC
PATH = /sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
endif
#
# Darwin
#
ifeq ($(ARCH), Darwin)
CC = gcc
CXX = g++
CFLAGS.EXTRA32 += -m32 -mmacosx-version-min=10.5 -fPIC
CFLAGS.EXTRA64 += -m64 -mmacosx-version-min=10.5 -fPIC
PATH = /usr/bin:/bin:/usr/sbin:/sbin
endif
V_M_EXIST = $(shell test -e CONFIG.mk && echo 1)
ifeq ($(V_M_EXIST), 1)
include CONFIG.mk
endif
ECHO = echo
all::
make -f Makefile all
configure32::
@-/bin/rm CONFIG.mk; touch CONFIG.mk
@echo "GLEW_DEST = $(APPDIR32)" >> CONFIG.mk
@echo "export GLEW_DEST" >> CONFIG.mk
@echo "LIBDIR = $(APPDIR32)/lib" >> CONFIG.mk
@echo "export LIBDIR" >> CONFIG.mk
@echo "CFLAGS.EXTRA = $(CFLAGS.EXTRA32)" >> CONFIG.mk
@echo "export CFLAGS.EXTRA" >> CONFIG.mk
configure64::
@-/bin/rm VAPOR.mk; touch CONFIG.mk
@echo "GLEW_DEST = $(APPDIR64)" >> CONFIG.mk
@echo "export GLEW_DEST" >> CONFIG.mk
@echo "LIBDIR = $(APPDIR64)/lib" >> CONFIG.mk
@echo "export LIBDIR" >> CONFIG.mk
@echo "CFLAGS.EXTRA = $(CFLAGS.EXTRA64)" >> CONFIG.mk
@echo "export CFLAGS.EXTRA" >> CONFIG.mk
install::
make -f Makefile install
clean::
make -f Makefile clean
frog::
@$(ECHO) APPDIR = $(APPDIR32)