1

我一直在尝试在 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)
4

2 回答 2

1

编辑:更新以反映看似有效的解决方法

第一种方法

由于乍一看将 32 位代码与 64 位库链接起来不起作用,唯一的问题似乎是config/Makefile.linux从第 5 行开始的以下片段:

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宏中。

于 2013-04-07T05:19:56.523 回答
0

由于其他答案很有用,因此情况可能会随着 glew 发生变化。我有更好的运气

make -j LDFLAGS.SO=-m32 LDFLAGS.DYNAMIC=-m32 CFLAGS=-m32

如果您同时构建 32 位和 64 位库,请不要忘记make clean在两者之间进行构建。

于 2016-11-01T04:23:51.190 回答