我一直在尝试在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),它就会工作得很好。只要确保设置为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)
发布于 2013-04-07 05:19:57
编辑:已更新,以反映看似可行的解决方法
第一种方法
由于将32位代码与64位lib链接起来不起作用,唯一的问题似乎是从第5行开始的以下config/Makefile.linux
代码片段:
M_ARCH ?= $(shell uname -m)
ifeq (x86_64,${M_ARCH})
LDFLAGS.EXTRA = -L/usr/X11R6/lib64 -L/usr/lib64
LIBDIR = $(GLEW_DEST)/lib64
else
LDFLAGS.EXTRA = -L/usr/X11R6/lib -L/usr/lib
LIBDIR = $(GLEW_DEST)/lib
endif
将库搜索路径硬编码为64位库。
第二眼
作为第一次尝试,尝试如下所示:
make LDFLAGS=-m32 M_ARCH=anything_but_not_x86_64
仍然失败了,事实证明,除了忽略公共约定之外,LDFLAGS
将不会被传递到Makefile
中的链接器,并遵循类似于第108行的规则:
lib/$(LIB.SHARED): $(LIB.SOBJS)
$(LD) $(LDFLAGS.SO) -o $@ $^ $(LIB.LDFLAGS) $(LIB.LIBS)
其中LDFLAGS.whatever被硬编码到所需的开关。
建议的解决方法
而任何一种解决方法,如:
make LDFLAGS.SO="-L/usr/lib -L/usr/X11R6/lib -m32"
最容易打字的似乎是下面这个:
make LD="gcc -m32"
将-m32
开关走私到LD
宏中。
发布于 2016-11-01 04:23:51
随着glew的出现,事情可能发生了变化,因为另一个答案很有用。我有更好的运气
make -j LDFLAGS.SO=-m32 LDFLAGS.DYNAMIC=-m32 CFLAGS=-m32
如果您同时构建32位和64位库,不要忘记在构建两者之间使用make clean
。
https://stackoverflow.com/questions/15859031
复制