2009年3月23日月曜日

libjpeg vc 備忘録

 ウィンドウズの Visual Studio で、libjpeg をコンパイルするときの手順の備忘録。
install.doc にあるように

C:\jpeg-6b> copy jconfig.vc jconfig.h
C:\jpeg-6b> copy makelib.ds jpeg.mak
C:\jpeg-6b> copy makeapps.ds apps.mak

としてから、

C:\jpeg-6b> nmake -f makefile.vc nodebug=1
C:\jpeg-6b> nmake -f makefile.vc nodebug=1 test

でOK。

win32.mak を利用しているので、DLL 版を作成したい場合は、makefile.vc に対して

# You may want to adjust these compiler options:
#CFLAGS= $(cflags) $(cdebug) $(cvars) -I.
CFLAGS= $(cflags) $(cdebug) $(cvarsdll) -I.
# Generally, we recommend defining any configuration symbols in jconfig.h,
# NOT via -D switches here.

# Link-time options:
#LDFLAGS= $(ldebug) $(conlflags)
LDFLAGS= $(ldebug) $(dlllflags)

# To link any special libraries, add the necessary commands here.
#LDLIBS= $(conlibs)
LDLIBS= $(guilibsdll)

...
...
...

libjpeg.lib: $(LIBOBJECTS)
$(RM) libjpeg.lib
link -out:libjpeg.dll /DLL $(LIBOBJECTS)
mt -manifest libjpeg.dll.manifest -outputresource:libjpeg.dll;2
# lib -out:libjpeg.lib $(LIBOBJECTS)

として、jmorecfg.h を

//#define GLOBAL(type) type
#define GLOBAL(type) __declspec(dllexport) type
/* a reference to a GLOBAL function: */
//#define EXTERN(type) extern type
#define EXTERN(type) extern __declspec(dllexport) type

にすればよい。ただし、makefile の作りが元々 DLL を考慮していないので、テストに失敗します。テストしたい場合には、CFLAGS, LDFLAGS, LDLIBS 等の変更を戻して、del *.exe してから行えばよい。

参考URL: http://www.amy.hi-ho.ne.jp/jbaba/jpeg13.htm

追記:コメントが逆だったので訂正しました。

LNK2019 とエラーになる場合は、


extern "C" {
#include <jconfig.h>
#include <libjpeg.h>
};

更に INT32 が再定義されるというエラーに悩まされる場合には、jmorecfg.h に以下の修正を入れて、include する前に #define DISABLE_INT32 というようにする。

#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */
#ifndef DISABLE_INT32
typedef long INT32;
#endif
#endif

ちなみに、 #define XMD_H をしても良いのだろうけど、影響範囲がパッと見に推定できないので、このようにした。

追記: manifest を埋め込む。

C:> mt -manifest libjpeg.dll.manifest -outputresource:libjpeg.dll;2

とすれば、OK。

0 件のコメント: