64 ビット RedHat 4 マシンで GLEW-1.9.0 の 32 ビット共有ライブラリをコンパイルしようとしてきましたが、何を試しても、それが生成する共有ライブラリは 64 ビットです (これは決定済みです)。出力ディレクトリで「file libGLEW*」を使用します)。
GLEW には、アーキテクチャを検出するための独自のシステムがあるようです。最終的に、これは「setarch i386」を使用して変更しようとした「shell uname -m」に帰着します。その呼び出しの後の「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 ビットであり、以下に説明するように、それが不平を言う理由の 1 つです。
ビルド中に、次のような警告が繰り返し表示されます...
/usr/bin/ld: warning: i386 architecture of input file `tmp/linux/default/shared/glew.o' is incompatible with i386:x86-64 output
1 つの質問: 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 は、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)