■■■■■■□■■■■■■□■■■■■■□□□□□■■□■■■■■■
■■□□■■□■■□□■■□■■□□□□□■■■■■■□■■□□□□
■■□□■■□■■□□■■□■■□□□□□■■□□■■□■■■■■■
■■□□■■□■■□□■■□■■□□□□□■■□□■■□□□□□■■
■■□□■■□■■■■■■□■■■■■■□■■■■■■□■■■■■■

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

c/migemo MinGWでのビルドについて

luamigemoからc/migemoをダイナミックリンクするにあたって
インポートライブラリとDLLを作らなきゃないのですが、
結構苦心(つーかパッチが必要になったんですがw)したのでメモ。
c/migemoのバージョンはリポジトリの(https://code.google.com/p/cmigemo/)144をベースにしています。

c/migemoのAPIがMinGWでコンパイルする時は
__stdcallでの呼び出しにならないようになっていたのですが、
Vimその他からもmigemo.dllが参照されることを考えると__stdcallにする必要があります。
で、大変なのはここからでした…

__stdcallにするとエクスポート関数の名前に@数字(引数のサイズ)の
サフィックスがつくのですが(以下サフィックス)、
最終的に欲しいのは
エクスポート関数の名前にはサフィックスなし、
インポートライブラリの方はサフィックスあり
というわけの分からん代物です。

これを実現するため僕が取った方法は
サフィックス付きのDEFファイルを食わせ、且つ--kill-atを付けて
インポートライブラリを作成するという方法でした。
で必要なのがサフィックス付きのDEFですが、ソースに同梱のものはサフィックスなし…
これを弄るのは他のコンパイラへの影響が未知なので却下です。
そこで、migemo.hを修正し、
MinGWでコンパイルする時に関数定義に__declspec(dllexport)
付けるよう修正しました。これなら#ifdefでできるので。
この状態でdllwrapでDEFを吐くとめでたくサフィックス付きDEFが出力されます。

DLLのエクスポート関数名はサフィックスなしですが、--kill-atを付けて同時に出力は出来ませんでした。
DEFのサフィックスも消えてしまいます。なのでDEF, DLL2段階の手順で出力です。

P.S.
サフィックスなしのDEFを使うと、全てDLLもインポートライブラリ内も全てサフィックスなしになってしまい
luamigemoビルド時にコンパイルエラーになります。migemo_open@4がない!とか。
--enable-stdcall-fixupって効きそうでダメなんですよね…
たしかインポートライブラリではなくDLLを直接指定しちゃうと通ったような(記憶が確かならば)

以下パッチです。
[raw]
diff -r 4e16f44f91df -r 7af800edb1d4 compile/Make_mingw.mak
--- a/compile/Make_mingw.mak
+++ b/compile/Make_mingw.mak
@@ -12,9 +12,12 @@
 libmigemo_LIB = $(outdir)libmigemo.dll.a
 libmigemo_DSO = $(outdir)$(DLLNAME)
 EXEEXT = .exe
-CFLAGS_MIGEMO =
+CFLAGS_MIGEMO = -D_MIGEMO_EXPORTS
 LDFLAGS_MIGEMO =
 CC = gcc
+DLLTOOL = dlltool
+DLLWRAP = dllwrap
+DLLFLAGS_MIGEMO = -k
 
 include config.mk
 include compile/unix.mak
@@ -24,10 +27,18 @@
 
 ##############################################################################
 # 環境に応じてライブラリ構築法を変更する
-#
+
 $(libmigemo_LIB): $(libmigemo_DSO)
-$(libmigemo_DSO): $(libmigemo_OBJ) $(srcdir)migemo.def
-   dllwrap -o $(libmigemo_DSO) --dllname $(DLLNAME) --implib $(libmigemo_LIB) --def $(srcdir)migemo.def $(libmigemo_OBJ)
+   # <@n>付きDEFを使い、-k(--kill-at)を付けてlib*.a出力
+   $(DLLTOOL) -D $< -d $(outdir)migemo.def -l $@ $(DLLFLAGS_MIGEMO)
+
+$(libmigemo_DSO): $(libmigemo_OBJ)
+   # DEF出力。一緒に-k(--kill-at)を指定するとDEFファイルの<@n>も消える
+   $(DLLWRAP) -o $@ $^ --dllname $(DLLNAME) --output-def $(outdir)migemo.def
+   # 関数名に<@n>が付いてるので一度削除
+   $(RM) $@
+   # DLL出力。-k(--kill-at)を付けて<@n>を削除
+   $(DLLWRAP) -o $@ $^ $(DLLFLAGS_MIGEMO)
 
 install-lib: $(libmigemo_DSO) $(libmigemo_LIB)
    $(INSTALL_DATA)     $(libmigemo_LIB) $(libdir)
diff -r 4e16f44f91df -r 7af800edb1d4 src/migemo.h
--- a/src/migemo.h
+++ b/src/migemo.h
@@ -8,12 +8,22 @@
 #ifndef MIGEMO_H
 #define MIGEMO_H
 
-#if defined(_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN32__)
+#if defined(_WIN32) && !defined(__CYGWIN32__)
 # define MIGEMO_CALLTYPE __stdcall
 #else
 # define MIGEMO_CALLTYPE
 #endif
 
+#if defined(_WIN32) && defined(__MINGW32__)
+# ifdef _MIGEMO_EXPORTS
+#  define MIGEMO_DECLSPEC __declspec(dllexport)
+# else
+#  define MIGEMO_DECLSPEC __declspec(dllimport)
+# endif
+#else
+# define MIGEMO_DECLSPEC
+#endif
+
 #define MIGEMO_VERSION "1.3"
 
 /* for migemo_load() */
@@ -45,25 +55,25 @@
 extern "C" {
 #endif
 
-migemo* MIGEMO_CALLTYPE    migemo_open(const char* dict);
-void MIGEMO_CALLTYPE   migemo_close(migemo* object);
-unsigned char* MIGEMO_CALLTYPE migemo_query(migemo* object,
+MIGEMO_DECLSPEC migemo* MIGEMO_CALLTYPE    migemo_open(const char* dict);
+MIGEMO_DECLSPEC void MIGEMO_CALLTYPE   migemo_close(migemo* object);
+MIGEMO_DECLSPEC unsigned char* MIGEMO_CALLTYPE migemo_query(migemo* object,
    const unsigned char* query);
-void MIGEMO_CALLTYPE   migemo_release(migemo* object,
+MIGEMO_DECLSPEC void MIGEMO_CALLTYPE   migemo_release(migemo* object,
    unsigned char* string);
 
-int MIGEMO_CALLTYPE    migemo_set_operator(migemo* object, int index,
+MIGEMO_DECLSPEC int MIGEMO_CALLTYPE    migemo_set_operator(migemo* object, int index,
    const unsigned char* op);
-const unsigned char* MIGEMO_CALLTYPE migemo_get_operator(migemo* object,
+MIGEMO_DECLSPEC const unsigned char* MIGEMO_CALLTYPE migemo_get_operator(migemo* object,
    int index);
-void MIGEMO_CALLTYPE   migemo_setproc_char2int(migemo* object,
+MIGEMO_DECLSPEC void MIGEMO_CALLTYPE   migemo_setproc_char2int(migemo* object,
    MIGEMO_PROC_CHAR2INT proc);
-void MIGEMO_CALLTYPE   migemo_setproc_int2char(migemo* object,
+MIGEMO_DECLSPEC void MIGEMO_CALLTYPE   migemo_setproc_int2char(migemo* object,
    MIGEMO_PROC_INT2CHAR proc);
 
-int MIGEMO_CALLTYPE    migemo_load(migemo* obj, int dict_id,
+MIGEMO_DECLSPEC int MIGEMO_CALLTYPE    migemo_load(migemo* obj, int dict_id,
    const char* dict_file);
-int MIGEMO_CALLTYPE    migemo_is_enable(migemo* obj);
+MIGEMO_DECLSPEC int MIGEMO_CALLTYPE    migemo_is_enable(migemo* obj);
 
 #ifdef __cplusplus
 }

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。


テーマ:プログラミング - ジャンル:コンピュータ

  1. 2012/02/08(水) 23:29:21|
  2. フリーソフト
  3. | トラックバック:0
  4. | コメント:0
<<02/08のツイートまとめ | ホーム | 02/07のツイートまとめ>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://nocd5.blog59.fc2.com/tb.php/509-9c9b3366
この記事にトラックバックする(FC2ブログユーザー)
home

プロフィール

Author:nocd5
30歳(男)
会社員

Last.fm



最近の記事

カテゴリー

カレンダー

04 | 2017/05 | 06
Sun Mon Tue Wed Thu Fri Sat
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -

最近のコメント

最近のトラックバック

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

Amazonアソシエイト

RSSフィード

リンク

このブログをリンクに追加する

FC2ブログランキング

FC2Blog Ranking

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。