Создайте DLL, используя Makefile для работы в Windows XP (32-разрядная версия) и Windows 7 (64-разрядная версия) - PullRequest
4 голосов
/ 23 декабря 2011

Мне нужно изменить приведенный ниже make-файл, чтобы создать dll (SampleNew.dll), который будет работать в 32-битных окнах и 64-битной среде Windows. Возможно, создание двух DLL (один для 64 и один для 32) является лучшим подходом. Он должен использовать SampleApi.dll (в объявлении LIBS ниже). Ниже не создается действительная 32-битная DLL для Windows. Любые идеи о том, как изменить ниже, чтобы он работал?

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 $@

$(TARGET): $(OBJECTS)
    $(LD) $(OBJECTS) $(LDFLAGS) -o $@

$(DIRS):
    mkdir -p $@

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 $@

$(TARGET): $(OBJECTS)
    $(LD) $(OBJECTS) $(LDFLAGS) -o $@

$(DIRS):
    mkdir -p $@

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

Ответы [ 2 ]

1 голос
/ 01 января 2012

Самое простое, что вы можете сделать, это построить оба по отдельности. Например, определение:

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, поскольку он генерирует 32-битный код для x86-64, который может использовать инструкции, недоступные в x86.

1 голос
/ 29 декабря 2011

Ваша цепочка инструментов должна поддерживать обе биты; ваш компилятор и компоновщик должны иметь возможность генерировать как 64-битный, так и 32-битный код, или вы можете иметь две отдельные цепочки инструментов. Давайте предположим, что ваш компилятор находится в 64-битном режиме по умолчанию и использует переключатель для создания 32-битного кода. Вы можете использовать переменные, специфичные для цели, в make, чтобы установить этот переключатель для 32-битной сборки.
Помимо компилятора, вам также придется установить некоторые другие переменные для двух сборок по-разному. На ум приходят OBJ_DIR и LIB_DIR, поэтому выходные файлы не смешиваются; LIB_INCLUDES, поскольку для обеих сборок требуются собственные версии библиотек, с которыми вы ссылаетесь (поэтому вам понадобятся две версии SampleApi.dll).

Ваш make-файл будет выглядеть примерно так:

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)

(я исключил части, которые не нужно менять.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...