How to compile OpenJPEG in MinGW?
The “How to compile and install external libs of FFMPEG?” has described the simple way to compile OpenJPEG for FFMPEG. However, if readers need generate static and dynamical libraries at the same time, how to handle this requirement?
As the mentioned before, referring to “How to generate DLL files by GCC in the MinGW?” and “How to use GCC to build DLL by DEF file in MinGW?”, we can do it by DEF file to build DLL library for the usage of Windows.
To ease to re-use by readers, I have modified the Makefile encapsulated by openjpeg_v1_3.tar.gz. Please refer to the following content, and readers can replace the original one by making full use of it.
# Linux makefile for OpenJPEG
VER_MAJOR = 2 VER_MINOR = 1.3.0
SRCS = ./libopenjpeg/bio.c ./libopenjpeg/cio.c ./libopenjpeg/dwt.c ./libopenjpeg/event.c ./libopenjpeg/image.c ./libopenjpeg/j2k.c ./libopenjpeg/j2k_lib.c ./libopenjpeg/jp2.c ./libopenjpeg/jpt.c ./libopenjpeg/mct.c ./libopenjpeg/mqc.c ./libopenjpeg/openjpeg.c ./libopenjpeg/pi.c ./libopenjpeg/raw.c ./libopenjpeg/t1.c ./libopenjpeg/t2.c ./libopenjpeg/tcd.c ./libopenjpeg/tgt.c INCLS = ./libopenjpeg/bio.h ./libopenjpeg/cio.h ./libopenjpeg/dwt.h ./libopenjpeg/event.h ./libopenjpeg/fix.h ./libopenjpeg/image.h ./libopenjpeg/int.h ./libopenjpeg/j2k.h ./libopenjpeg/j2k_lib.h ./libopenjpeg/jp2.h ./libopenjpeg/jpt.h ./libopenjpeg/mct.h ./libopenjpeg/mqc.h ./libopenjpeg/openjpeg.h ./libopenjpeg/pi.h ./libopenjpeg/raw.h ./libopenjpeg/t1.h ./libopenjpeg/t2.h ./libopenjpeg/tcd.h ./libopenjpeg/tgt.h ./libopenjpeg/opj_malloc.h ./libopenjpeg/opj_includes.h INCLUDE = -Ilibopenjpeg
# General configuration variables: CC = gcc AR = ar
PREFIX = /mingw INSTALL_LIBDIR = $(PREFIX)/lib INSTALL_INCLUDE = $(PREFIX)/include
# Converts cr/lf to just lf DOS2UNIX = dos2unix
COMPILERFLAGS = -Wall -O3 -ffast-math -std=c99 -fPIC LIBRARIES = -lstdc++
MODULES = $(SRCS:.c=.o) CFLAGS = $(COMPILERFLAGS) $(INCLUDE)
TARGET = openjpeg STATICLIB = lib$(TARGET).a SHAREDLIB = lib$(TARGET)-$(VER_MAJOR).$(VER_MINOR).dll LIBNAME = lib$(TARGET)-$(VER_MAJOR).$(VER_MINOR).dll.a
default: all
all: OpenJPEG
dist: OpenJPEG install -d dist install -m 644 $(STATICLIB) dist install -m 755 $(SHAREDLIB) dist install -m 644 $(SHAREDLIB).lib dist ln -sf $(SHAREDLIB) dist/$(LIBNAME) install libopenjpeg/openjpeg.h dist
dos2unix: @$(DOS2UNIX) $(SRCS) $(INCLS)
OpenJPEG: $(STATICLIB) $(SHAREDLIB)
.c.o: $(CC) $(CFLAGS) -c $< -o $@
$(STATICLIB): $(MODULES) $(AR) r $@ $(MODULES)
$(SHAREDLIB): $(MODULES) $(CC) -s -shared -Wl,--output-def,$(SHAREDLIB).def -Wl,--out-implib,$(LIBNAME) -Wl,-Bsymbolic -o $@ $(MODULES) $(LIBRARIES) lib.exe /machine:i386 /def:$(SHAREDLIB).def /out:$(SHAREDLIB).lib
install: OpenJPEG install -d '$(DESTDIR)$(INSTALL_LIBDIR)' '$(DESTDIR)$(INSTALL_INCLUDE)' install -m 644 $(STATICLIB) '$(DESTDIR)$(INSTALL_LIBDIR)' ranlib '$(DESTDIR)$(INSTALL_LIBDIR)/$(STATICLIB)' install -m 755 $(SHAREDLIB) '$(DESTDIR)$(INSTALL_LIBDIR)' ln -sf $(SHAREDLIB) '$(DESTDIR)$(INSTALL_LIBDIR)/$(LIBNAME)' install -m 644 libopenjpeg/openjpeg.h '$(DESTDIR)$(INSTALL_INCLUDE)'
clean: rm -rf core dist/ u2dtmp* $(MODULES) $(STATICLIB) $(SHAREDLIB) $(LIBNAME)
osx: make -f Makefile.osx
osxinstall: make -f Makefile.osx install
osxclean: make -f Makefile.osx clean |
Summarization
1. To build correctly, please use the below format.
$ make CFLAGS="-DWIN32 -DOPJ_STATIC $CFLAGS" |
WIN32 and OPJ_STATIC are MACROs, and denote that it is WIN32 and static format.
2. Please can use dist tag to store them in your locate folder after finishing compiling source codes..
$ make dist |
3. The original Makefile has not provided uninstall tag, and readers can add it in the light of installing configuration.