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
最近のコメント