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 閲覧 )

コメントを残す

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

CAPTCHA