使用Makefile创建DLL以在Windows XP(32位)和Windows 7(64位)上运
发布时间:2020-12-16 07:28:14 所属栏目:百科 来源:网络整理
导读:我需要修改下面的makefile来创建一个将在32位 Windows和64位 Windows环境中运行的dll(SampleNew.dll).也许创建两个dll(一个用于64,一个用于32)是最好的方法.它需要使用SampleApi.dll(在下面的LIBS声明中).以下内容不会为Windows创建有效的32位dll.有关如何修
我需要修改下面的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:testmyDllFile.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中不可用的指令. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |