windows - 使用 Makefile 创建 DLL 以在 Windows XP(32 位)和 Windows 7(64 位)上运行

标签 windows dll makefile

我需要修改下面的 makefile 以创建一个将在 32 位 Windows 和 64 位 Windows 环境中运行的 dll (SampleNew.dll)。也许创建两个 dll(一个用于 64 位,一个用于 32 位)是最好的方法。它需要使用 SampleApi.dll(在下面的 LIBS 声明中)。以下不会为 Windows 创建有效的 32 位 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 $@

$(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)

最佳答案

您可以做的最简单的事情就是分别构建两者。例如,定义:

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-64 生成 32 位代码,这可能会使用 x86 中不可用的指令。

关于windows - 使用 Makefile 创建 DLL 以在 Windows XP(32 位)和 Windows 7(64 位)上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8610983/

相关文章:

c++ - 简单的 Hook 程序

c - 使 : *** No rule to make target 'main.c' , 需要 'main.o' 。停止

c# - 无法在运行时访问 RowSpan 属性?

windows - 我的 Racket 方案命令行在 Windows Powershell 中无法正常工作,我做错了什么

c++ - Visual C++ DLL 项目中的冲突运行时库

PHP 在 Windows 机器上安装 SSH2

Android 只能使用 make 版本 3.81 构建

makefile - makefile 中多行列表中的注释

C# 最小化窗口未通过调用 System.Diagnostics.Process.GetProcesses() 返回

c - 我应该 IUnknown::Release 使用 DllGetClassObject 创建的接口(interface)吗