D言語でSWT関連のエラーが出る
D言語を使用している中で、SWT関連のエラーが出た。
そこで本稿はそれらに関するメモを残す。
2017/11/28 追記
環境は、Windows 10, D 2.077です。
2017/12/16 追記
結論から言うと、いろいろ(その2、その3)試してみたけれど、まったくもって解決できなかった。
1,Error message
(1)test.d
// Written in the D programming language.
// dmd 2.066.1
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Label;
void main()
{
auto display = new Display;
auto shell = new Shell(display);
shell.setText("hello world");
shell.setLayout(new FillLayout());
shell.setSize(300, 200);
auto label = new Label(shell, SWT.NONE);
label.setText("hello world");
shell.open();
while (!shell.isDisposed) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
Console
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."]
D言語でSWTの機能を使用しようとすると、こんな感じのエラーメッセージが出て使用できない。
2,Process
(1)OleClientSite.di
エラーメッセージが出ているOleClientSite.diを書き換える。
本件エラーメッセージでは、OleClientSite.diの84行目付近に問題があるとしている。
そこでは下記のようなコードが記載されていた。
aspect = COM.DVASPECT_CONTENT;
type = COM.OLEEMBEDDED;
isStatic = false;
// this is 84 line ( by jskny ).
listener = new class class __anonclass75 : Listener
{
public void handleEvent(Event e);
}
;
frame.addListener(SWT.Resize, listener);
frame.addListener(SWT.Move, listener);
addListener(SWT.Dispose, listener);
addListener(SWT.FocusIn, listener);
addListener(SWT.FocusOut, listener);
addListener(SWT.Paint, listener);
addListener(SWT.Traverse, listener);
addListener(SWT.KeyDown, listener);
これを、次のようにコメントアウトしてみる。
/* listener = new class class __anonclass75 : Listener
{
public void handleEvent(Event e);
}
;*/
その後再度SWTを使用するコードをコンパイルしてみると、エラーメッセージが変わった。
R:\>dmd test.d
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleFrame.di(44): Error: basic type expected, not class
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleFrame.di(44): Error: { members } expected for anonymous class
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleFrame.di(44): Error: found class when expecting ; following statement
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleFrame.di(45): Error: found { when expecting ; following statement
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleFrame.di(46): Error: found public instead of statement
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleFrame.di(49): 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\OleFrame.di(49): Error: no identifier for declarator addListener(SWT.Activate, listener)
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleFrame.di(50): 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\OleFrame.di(50): Error: no identifier for declarator addListener(SWT.Deactivate, listener)
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleFrame.di(51): 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\OleFrame.di(51): Error: no identifier for declarator addListener(SWT.Dispose, listener)
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleFrame.di(52): 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\OleFrame.di(52): Error: no identifier for declarator addListener(SWT.Resize, listener)
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleFrame.di(53): 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\OleFrame.di(53): Error: no identifier for declarator addListener(SWT.Move, listener)
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleFrame.di(54): 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\OleFrame.di(54): Error: no identifier for declarator this.AddRef()
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleFrame.di(56): 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\OleFrame.di(56): Error: no identifier for declarator initCheckFocus(display)
C:\bin\D\dmd2\windows\bin\..\..\dwt\imp\org\eclipse\swt\ole\win32\OleFrame.di(57): Error: function declaration without return type. (Note that constructors are always named this)
もちろん、このOleFrame.diを書き換える作業を行う。
(2)OleFrame.di
問題となった、OleFrame.diの44行からは下記のようなコードが続く。
// this is 44 line ( by jskny ).
listener = new class class __anonclass76 : Listener
{
public void handleEvent(Event e);
}
;
addListener(SWT.Activate, listener);
addListener(SWT.Deactivate, listener);
addListener(SWT.Dispose, listener);
addListener(SWT.Resize, listener);
addListener(SWT.Move, listener);
this.AddRef();
Display display = getDisplay();
initCheckFocus(display);
initMsgHook(display);
もちろん怪しいlistenerオブジェクトをコメントアウトしてみる。
/*listener = new class class __anonclass76 : Listener
{
public void handleEvent(Event e);
}
;*/
再度コードをコンパイルしてみると、エラーメッセージが変わった。
R:\>dmd 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
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
まぁよくわからんが、とりあえず、DWTを再度ビルドしろってことだと思うので、DWTを再度リビルドし自前のコードのコンパイルを行う。
Console
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
っげ、ソースコード再度ダウンロードされた…
(追記:2017/11/28 上述の2つのファイルはbuildにより作成されるため、変更箇所が元通りに上書きされていた。なお、下記の作業にはあまり意味がない。)
とりあえず、listenerオブジェクトが意味不明なので、両者ともに下記の通り修正する。
listener = new Listener;
そうすると、Consoleは、下記の通りになる。
R:\>dmd test
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,まとめ
(1)感想
よくわからない。結局うまく動かなかった。
D言語は闇の言語というが、まさにその通りな気がしてきた。
(2)考察
DMDとDWTの相性の問題に思えるため、DMDを最新版(2.077)ではなく、少し古いバージョンのDMDで試すことが必要かなと、感じた。
4,参考記事
dwtを使ってみた(Windowsインストール編) – Qiita ( 2017/11/27 閲覧 )
最近のコメント