D言語でSWT関連のエラーが出る その2

1,Introduction

D言語でSWTを使用しようとしたが、うまく動かなかった。

前回の悪戦苦闘の記録は、こちらをご覧ください。

環境は、Windows10, D(DMD32 D Compiler v2.077.0)です。

2017/11/30 追記

2017/12/16 追記

結論から言うと、いろいろ(その1その3)試してみたけれど、まったくもって解決できなかった。

2,Process

(1)DWT

D言語でSWTを使用するためのライブラリとして、DWT(d-widget-toolkit)がある。

それのインストール手続きは下記の通り行った。

Command

git clone https://github.com/d-widget-toolkit/dwt.git
cd dwt
git submodule update --init
git submodule foreach git pull origin master
rdmd build base swt

Logs

C:\bin\D\dmd2>git clone https://github.com/d-widget-toolkit/dwt.git
Cloning into 'dwt'...
remote: Counting objects: 1431, done.
rRemote: Total 1431 (delta 0), reused 0 (delta 0), pack-reused 1431
Receiving objects: 100% (1431/1431), 2.98 MiB | 132.00 KiB/s, done.

Resolving deltas: 100% (559/559), done.
Checking connectivity... done.
Checking out files: 100% (1375/1375), done.

C:\bin\D\dmd2\dwt>git submodule update --init

C:\bin\D\dmd2\dwt>git submodule foreach git pull origin master

C:\bin\D\dmd2\dwt>rdmd build base swt
(in C:\bin\D\dmd2\dwt)
Building dwt-base
workdir=>C:\bin\D\dmd2\dwt\base\src
dmd.exe @C:\bin\D\dmd2\dwt\rsp
dmd.exe @C:\bin\D\dmd2\dwt\rsp > C:\bin\D\dmd2\dwt\olog.txt
Building org.eclipse.swt.win32.win32.x86
workdir=>C:\bin\D\dmd2\dwt\org.eclipse.swt.win32.win32.x86\src
dmd.exe @C:\bin\D\dmd2\dwt\rsp
dmd.exe @C:\bin\D\dmd2\dwt\rsp > C:\bin\D\dmd2\dwt\olog.txt

続いて、DMDがDWTを探せるように、DMDの設定ファイルを書き換えた。

(2)sc.ini

DWTのインストールが完了したからといって、すぐにその機能が使えるわけではない。

この段階で、SWTを使用しようとすると、下記のエラーメッセージが表示される。

Logs

R:\>rdmd test.d
test.d(3): Error: module SWT is in file 'org\eclipse\swt\SWT.d' which cannot be read
import path[0] = .
import path[1] = C:\bin\D\dmd2\windows\bin\..\..\src\phobos
import path[2] = C:\bin\D\dmd2\windows\bin\..\..\src\druntime\import
Failed: ["dmd", "-v", "-o-", "test.d", "-I."]

D言語側からDWTが認識できていないことが問題であった。

そこで、これに対処をする。

私の環境は、C:\bin\D\dmd2がD言語関連のフォルダであるため、ここに、DWTフォルダを作成している。

すなわち、DWTは、C:\bin\D\dmd2\dwt フォルダの中に入っている。

これらを踏まえて、C:\bin\D\dmd2\windows\binフォルダ内にあるsc.iniを書き足す。

Original

; environment for both 32/64 bit
[Environment]
DFLAGS="-I%@P%\..\..\src\phobos" "-I%@P%\..\..\src\druntime\import"

; optlink only reads from the Environment section so we need this redundancy
; from the Environment32 section (bugzilla 11302)
LIB="%@P%\..\lib"


[Environment32]
LIB="%@P%\..\lib"
LINKCMD=%@P%\link.exe


[Environment64]
LIB="%@P%\..\lib64"

Changed

; environment for both 32/64 bit
[Environment]
DFLAGS="-I%@P%\..\..\src\phobos" "-I%@P%\..\..\src\druntime\import" "-I%@P%\..\..\import" "-I%@P%\..\..\dwt\imp" "-J%@P%\..\..\dwt\res"

; optlink only reads from the Environment section so we need this redundancy
; from the Environment32 section (bugzilla 11302)
LIB="%@P%\..\lib"


[Environment32]
LIB="%@P%\..\lib";"%@P%\..\..\dwt\lib"
LINKCMD=%@P%\link.exe


[Environment64]
LIB="%@P%\..\lib64";"%@P%\..\..\dwt\lib"

この変更をすることにより、D言語からSWTの機能を簡単に呼び出しやすくなる(別に必須の処理ではない)。

これにより、SWTの機能が使用できるかというと、そうではない。

エラーメッセージが変わるだけである。

R:\>rdmd test.d
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleClientSite.di(84): Error: basic type expected, not class
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleClientSite.di(84): Error: { members } expected for anonymous class
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleClientSite.di(84): Error: found class when expecting ; following statement
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleClientSite.di(85): Error: found { when expecting ; following statement
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleClientSite.di(86): Error: found public instead of statement
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleClientSite.di(89): Error: function declaration without return type. (Note that constructors are always named this)
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleClientSite.di(89): Error: no identifier for declarator frame.addListener(SWT.Resize, listener)
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleClientSite.di(90): Error: function declaration without return type. (Note that constructors are always named this)
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleClientSite.di(90): Error: no identifier for declarator frame.addListener(SWT.Move, listener)
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleClientSite.di(91): Error: function declaration without return type. (Note that constructors are always named this)
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleClientSite.di(91): Error: no identifier for declarator addListener(SWT.Dispose, listener)
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleClientSite.di(92): Error: function declaration without return type. (Note that constructors are always named this)
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleClientSite.di(92): Error: no identifier for declarator addListener(SWT.FocusIn, listener)
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleClientSite.di(93): Error: function declaration without return type. (Note that constructors are always named this)
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleClientSite.di(93): Error: no identifier for declarator addListener(SWT.FocusOut, listener)
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleClientSite.di(94): Error: function declaration without return type. (Note that constructors are always named this)
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleClientSite.di(94): Error: no identifier for declarator addListener(SWT.Paint, listener)
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleClientSite.di(95): Error: function declaration without return type. (Note that constructors are always named this)
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleClientSite.di(95): Error: no identifier for declarator addListener(SWT.Traverse, listener)
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleClientSite.di(96): Error: function declaration without return type. (Note that constructors are always named this)
Failed: ["dmd", "-v", "-o-", "test.d", "-I."]

前回の記事をご覧になられた方にはもうご存知のエラーメッセージである。

(3)過去記事同様、OleClientSite.di, OleFrame.di を書き換える。

今回は、C:\bin\D\dmd2\dwt\imp\org\eclipse\swt\ole\win32ディレクトリ内にあるOleClientSite.di, OleFrame.diの中の前回の記事で指摘した個所を、

listener = new Listener;

と置き換える。

その結果エラーメッセージが変わった。

Logs

R:\>rdmd test.d
OPTLINK (R) for Win32  Release 8.00.17
Copyright (C) Digital Mars 1989-2013  All rights reserved.
http://www.digitalmars.com/ctg/optlink.html
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets7DisplayQi7__ClassZ
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets5LabelQg6__ctorMFCQBqQBpQBkQBj9CompositeQkiZCQCrQCqQClQCkQCfQCi
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets5LabelQg7__ClassZ
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt6layout10FillLayoutQm6__ctorMFZCQBwQBvQBqQBpQBlQBo
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt6layout10FillLayoutQm7__ClassZ
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets5ShellQg6__ctorMFCQBqQBpQBkQBj7DisplayQiZCQCoQCnQCiQChQCcQCf
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets5ShellQg7__ClassZ
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets7DisplayQi6__ctorMFZCQBtQBsQBnQBmQBhQBk
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt3SWT12__ModuleInfoZ
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt6layout10FillLayout12__ModuleInfoZ
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets7Display12__ModuleInfoZ
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets5Shell12__ModuleInfoZ
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets5Label12__ModuleInfoZ
Error: linker exited with status 13

(4)Static library

Twitter上で前回の記事について、@mono_shoo様から助言を頂けたので、参考に静的リンクライブラリの指定処理を追加する。

D言語での静的リンクライブラリの指定は、

dmd hoge.d -Lfuga.lib

のように、コンパイラにパラメーターとして指定する方法がある。

そこで、下記の通り力技を試してみた。

2017/11/30 追記
Twitter上で、@mono_shoo様から助言を受けました。
こうした静的ライブラリの指定はソースコードの中で、pragma(lib, “fuga.lib”);みたいに指定する事もできます。

Command

rdmd test -LC:\bin\D\dmd2\dwt\lib\advapi32.lib -LC:\bin\D\dmd2\dwt\lib\comctl32.lib -LC:\bin\D\dmd2\dwt\lib\comdlg32.lib -LC:\bin\D\dmd2\dwt\lib\gdi32.lib -LC:\bin\D\dmd2\dwt\lib\kernel32.lib -LC:\bin\D\dmd2\dwt\lib\shell32.lib -LC:\bin\D\dmd2\dwt\lib\ole32.lib -LC:\bin\D\dmd2\dwt\lib\oleaut32.lib -LC:\bin\D\dmd2\dwt\lib\olepro32.lib -LC:\bin\D\dmd2\dwt\lib\oleacc.lib -LC:\bin\D\dmd2\dwt\lib\user32.lib -LC:\bin\D\dmd2\dwt\lib\usp10.lib -LC:\bin\D\dmd2\dwt\lib\msimg32.lib -LC:\bin\D\dmd2\dwt\lib\opengl32.lib -LC:\bin\D\dmd2\dwt\lib\shlwapi.lib -LC:\bin\D\dmd2\dwt\lib\dwt-base.lib -LC:\bin\D\dmd2\dwt\lib\org.eclipse.swt.win32.win32.x86.lib

Logs

R:\>rdmd test -LC:\bin\D\dmd2\dwt\lib\advapi32.lib -LC:\bin\D\dmd2\dwt\lib\comctl32.lib -LC:\bin\D\dmd2\dwt\lib\comdlg32.lib -LC:\bin\D\dmd2\dwt\lib\gdi32.lib -LC:\bin\D\dmd2\dwt\lib\kernel32.lib -LC:\bin\D\dmd2\dwt\lib\shell32.lib -LC:\bin\D\dmd2\dwt\lib\ole32.lib -LC:\bin\D\dmd2\dwt\lib\oleaut32.lib -LC:\bin\D\dmd2\dwt\lib\olepro32.lib -LC:\bin\D\dmd2\dwt\lib\oleacc.lib -LC:\bin\D\dmd2\dwt\lib\user32.lib -LC:\bin\D\dmd2\dwt\lib\usp10.lib -LC:\bin\D\dmd2\dwt\lib\msimg32.lib -LC:\bin\D\dmd2\dwt\lib\opengl32.lib -LC:\bin\D\dmd2\dwt\lib\shlwapi.lib -LC:\bin\D\dmd2\dwt\lib\dwt-base.lib -LC:\bin\D\dmd2\dwt\lib\org.eclipse.swt.win32.win32.x86.lib
OPTLINK (R) for Win32  Release 8.00.17
Copyright (C) Digital Mars 1989-2013  All rights reserved.
http://www.digitalmars.com/ctg/optlink.html
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets7DisplayQi7__ClassZ
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets5LabelQg6__ctorMFCQBqQBpQBkQBj9CompositeQkiZCQCrQCqQClQCkQCfQCi
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets5LabelQg7__ClassZ
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt6layout10FillLayoutQm6__ctorMFZCQBwQBvQBqQBpQBlQBo
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt6layout10FillLayoutQm7__ClassZ
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets5ShellQg6__ctorMFCQBqQBpQBkQBj7DisplayQiZCQCoQCnQCiQChQCcQCf
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets5ShellQg7__ClassZ
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets7DisplayQi6__ctorMFZCQBtQBsQBnQBmQBhQBk
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt3SWT12__ModuleInfoZ
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt6layout10FillLayout12__ModuleInfoZ
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets7Display12__ModuleInfoZ
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets5Shell12__ModuleInfoZ
r:\temp\.rdmd\rdmd-test.d-F9FA1A9736DFDDCDB8553FCE38B72DDF\objs\test.exe.obj(test.exe)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets5Label12__ModuleInfoZ
Error: linker exited with status 13

うーん・・・
静的ライブラリとしてDWTの中にあるのは全て指定してみたけれども、どうもダメっぽいです。

(5)DWTのソースを直接インポートする

まず、sc.ini を下記の通り修正する。
何をするのかというと、DWTのimpやresディレクトリを勝手に読み込みに行かないようにしている。
まぁ、元の状態に戻しただけなのだが。

; environment for both 32/64 bit
[Environment]
DFLAGS="-I%@P%\..\..\src\phobos" "-I%@P%\..\..\src\druntime\import" "-I%@P%\..\..\import"

; optlink only reads from the Environment section so we need this redundancy
; from the Environment32 section (bugzilla 11302)
LIB="%@P%\..\lib"


[Environment32]
LIB="%@P%\..\lib"
LINKCMD=%@P%\link.exe


[Environment64]
LIB="%@P%\..\lib64"

そして、直接DWTのソースを読み込むようにする。

Command

dmd test -IC:\bin\D\dmd2\dwt\org.eclipse.swt.win32.win32.x86\src -IC:\bin\D\dmd2\dwt\base\src -JC:\bin\D\dmd2\dwt\res

Logs

R:\>dmd test -IC:\bin\D\dmd2\dwt\org.eclipse.swt.win32.win32.x86\src -IC:\bin\D\dmd2\dwt\base\src -JC:\bin\D\dmd2\dwt\res
OPTLINK (R) for Win32  Release 8.00.17
Copyright (C) Digital Mars 1989-2013  All rights reserved.
http://www.digitalmars.com/ctg/optlink.html
test.obj(test)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets7DisplayQi7__ClassZ
test.obj(test)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets5LabelQg6__ctorMFCQBqQBpQBkQBj9CompositeQkiZCQCrQCqQClQCkQCfQCi
test.obj(test)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets5LabelQg7__ClassZ
test.obj(test)
 Error 42: Symbol Undefined _D3org7eclipse3swt6layout10FillLayoutQm6__ctorMFZCQBwQBvQBqQBpQBlQBo
test.obj(test)
 Error 42: Symbol Undefined _D3org7eclipse3swt6layout10FillLayoutQm7__ClassZ
test.obj(test)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets5ShellQg6__ctorMFCQBqQBpQBkQBj7DisplayQiZCQCoQCnQCiQChQCcQCf
test.obj(test)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets5ShellQg7__ClassZ
test.obj(test)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets7DisplayQi6__ctorMFZCQBtQBsQBnQBmQBhQBk
test.obj(test)
 Error 42: Symbol Undefined _D3org7eclipse3swt3SWT12__ModuleInfoZ
test.obj(test)
 Error 42: Symbol Undefined _D3org7eclipse3swt6layout10FillLayout12__ModuleInfoZ
test.obj(test)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets7Display12__ModuleInfoZ
test.obj(test)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets5Shell12__ModuleInfoZ
test.obj(test)
 Error 42: Symbol Undefined _D3org7eclipse3swt7widgets5Label12__ModuleInfoZ
Error: linker exited with status 13

あ、どっかで見たエラーでた・・・

やっぱり、リンクの問題っぽい

3,References

dwtを使ってみた(Windowsインストール編) – Qiita
k4nagatsuki / cwxeditor / ソース / cwxeditor_src / README.txt — Bitbucket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA