2011-12-22 9 views
4

以下のmakefileを変更して、32ビットのウィンドウで実行されるdll(SampleNew.dll)を作成する必要があります。 64ビットWindows環境たぶん2つのdll(1つは64、もう1つは32)を作成するのが最善の方法です。 SampleApi.dllを使用する必要があります(下のLIBS宣言で)。以下はWindows用の有効な32ビットdllを作成しません。それを動作させるために以下を変更する方法に関するアイデア?Windows XP(32ビット)およびWindows 7(64ビット)で実行するMakefileを使用してDLLを作成

CMODE= 

SWIG = swig 
CC = $(PREFIX)gcc 
LD = $(CC) 

OBJ_DIR = obj 
AUTOGEN_DIR = ../src/java 
PACKAGE_DIR = $(AUTOGEN_DIR)/com/test/sample 

PACKAGE = com.test.sample 

INCLUDES = -I$(JAVA_INCLUDE) \ 
      -I$(SAMPLE_DIR)/include \ 
      -I$(JDK_HOME)/include 

LIB_INCLUDES = -L$(SAMPLE_DIR)/lib 

LIBS = /lib/libssl.so.4 \ 
     /lib/libcrypto.so.4 \ 
     -lSampleApi \ 
     -lm 

DIRS = $(PACKAGE_DIR) $(DIST_DIR) $(OBJ_DIR) $(AUTOGEN_DIR) 

CFLAGS = $(CMODE) -Wall -fpic $(INCLUDES) -O0 -g3 
SFLAGS = -java $(INCLUDES) -package $(PACKAGE) -outdir $(PACKAGE_DIR) 
LDFLAGS = -shared $(LIB_INCLUDES) $(LIBS) 

OBJECTS = $(OBJ_DIR)/test_wrap.o 
TARGET = $(LIB_DIR)/SampleNew.dll 

all: $(DIRS) $(TARGET) 

%_wrap.c: %.i 
    $(SWIG) $(SFLAGS) $< 

$(OBJ_DIR)/%.o: %.c 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

$(TARGET): $(OBJECTS) 
    $(LD) $(OBJECTS) $(LDFLAGS) -o [email protected] 

$(DIRS): 
    mkdir -p [email protected] 

clean: 
    rm -rf $(TARGET) $(PACKAGE_DIR)/* $(TARGET) $(AUTOGEN_DIR) $(OBJ_DIR) 

例外:

java.lang.UnsatisfiedLinkError c:\test\myDllFile.dll: can't load this .dll (machine code=0x101) on a IA 32-bit platform 

更新のMakefile:

CMODE= 

SWIG = swig 
PREFIX=/test/mingw/mingw32/bin/i386-mingw32- 
CC = $(PREFIX)gcc 
LD = $(CC) 

OBJ_DIR = obj 
AUTOGEN_DIR = ../src/java 
PACKAGE_DIR = $(AUTOGEN_DIR)/com/test/jni 

PACKAGE = com.test.jni 

INCLUDES = -I$(HEADER_FILES_DIR) # env var that points to a dir with all the .h files 

LIB_INCLUDES = -L$(C_API_DIR)/lib # env var that points to a dir with the C libraries (dlls) 

LIBS = -lMainApi \ # MainApi.dll 
     -lm 

DIRS = $(PACKAGE_DIR) $(DIST_DIR) $(OBJ_DIR) $(AUTOGEN_DIR) # DIST_DIR is passed in 

CFLAGS = $(CMODE) -Wall -fpic $(INCLUDES) -O0 -g3 
SFLAGS = -java $(INCLUDES) -package $(PACKAGE) -outdir $(PACKAGE_DIR) 
LDFLAGS = -shared $(LIB_INCLUDES) $(LIBS) -leay32 -lws2_32 -lrpcrt4 

OBJECTS = $(OBJ_DIR)/test_wrap.o 
TARGET = $(LIB_DIR)/SampleJni.dll 

all: $(DIRS) $(TARGET) 

%_wrap.c: %.i 
    $(SWIG) $(SFLAGS) $< 

$(OBJ_DIR)/%.o: %.c 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

$(TARGET): $(OBJECTS) 
    $(LD) $(OBJECTS) $(LDFLAGS) -o [email protected] 

$(DIRS): 
    mkdir -p [email protected] 

clean: 
    rm -rf $(TARGET) $(PACKAGE_DIR)/* $(TARGET) $(AUTOGEN_DIR) $(OBJ_DIR) 
+0

32ビットDLLは64ビット版Windowsで実行されます... –

+4

@ todda.speot.is:ただし、メインプログラムも32ビットである場合のみです。 –

+0

私は少し混乱しています - それはCかJavaですか?いずれの場合でも、DLLが別の既存のDLL(SampleApi.dll)を使用している場合、SampleApi.dllと同じ(たとえば32ビット)にコンパイルすることしかできません。そうしないと、同じプロセスに常駐できません。 – Asaf

答えて

1

あなたができる最も簡単な事はしています両方を別々に構築する。例えば、定義:

CFLAGS = $(CMODE) -Wall -fpic $(INCLUDES) -O0 -g3 -march=$(ARCH) 
OBJ_DIR = obj-$(ARCH) 
LIB_DIR = lib-$(ARCH) 

.PHONY: default 
default: 
     $(MAKE) ARCH=i686 all 
     $(MAKE) ARCH=x86_64 all 

避け-m32、それは、x86で利用できない命令を使用することができるx86-64で、ために32ビットコードを生成するからです。

+1

私の理解では、x86/x64アーキテクチャでは、-m32は64ビットのツールチェーンを使用して32ビットアプリケーションを構築することができ、そのようなアプリケーションはx86ハードウェア上で正常に動作します。そうでないことを述べる参考資料を提供できますか? – Bukes

+0

これはGCCに32ビットコードを使用するように指示するだけですが、x86_64が許すものをサポートすることが期待されています。また、 '-Ox'を使用すると非常に不都合な整列で最適化します。一部のx86実装では、SYS *およびCMOV *命令が欠けているため、問題になります。ところで、64ビットのツールチェーンは32ビットのスーパーセットなので、問題なく-march = i686を使用できるはずです。 –

+0

OK - これを見なければなりませんでした。 GCCのmanページによると: "-m32/-m64 - 32ビットまたは64ビット環境のためのコードを生成する32ビット環境はint、long、および32ビットへのポインタを設定し、任意のi386システム上で動作するコードを生成する64ビット環境ではintを32ビットに設定し、longと64ビットへのポインタを設定し、AMDのx86-64アーキテクチャのコードを生成します.darwinの場合、-m64オプションは-fno-picと-mdynamic-no-写真のオプション。 – Bukes

1

あなたのツールチェーンは、両方bitnessesをサポートする必要があります。コンパイラとリンカは64ビットと32ビットの両方のコードを発行することができなければなりません。あるいは、2つの別個のツールチェーンを持つこともできます。コンパイラがデフォルトで64ビットモードにあり、32ビットコードを作成するためにスイッチを使用すると仮定しましょう。ターゲット固有の変数makeを使用して、このスイッチを32ビットビルド用に設定することができます。
コンパイラに加えて、2つのビルドで異なる変数を設定する必要があります。気になるものはOBJ_DIRLIB_DIRなので、出力ファイルは混在しません。 LIB_INCLUDESの両方のビルドには、リンクするライブラリの独自のバージョンが必要です(したがって、SampleApi.dllの2つのバージョンが必要です)。

あなたのメイクは、これらの線に沿って何かを見に来る:

32bit: CC   += -m32 
32bit: OBJ_DIR  = obj32 
32bit: LIB_DIR  := $(LIB_DIR)32 
32bit: LIB_INCLUDES = -L$(SAMPLE_DIR)/lib32 

all: 64bit 32bit 

64bit 32bit: $(DIRS) $(TARGET) 

(私は変更する必要はありません部品を除外しました。)

関連する問題