2009年3月23日月曜日

libjpeg vc 備忘録

 ウィンドウズの Visual Studio で、libjpeg をコンパイルするときの手順の備忘録。
必要な作業を簡略化できるので、まずは VC10用のプロジェクトを生成する。
C:\jpeg-9b> nmake -f makefile.vc setup-v10
次に
C:\jpeg-9b>  nmake  -f  makefile.vc  nodebug=1
C:\jpeg-9b>  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 /MANIFEST /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。

2017/10/30: vc10 から link オプションの /MANIFEST がデフォルトでなくなったのでオプションを追記

0 件のコメント: