On Thursday, 20 October 2016 at 04:52:11 UTC, Jason C. Wells
wrote:
This is probably a general programming question. I'll follow up
here since this thread is the inspiration for my current
question.
When attempting to compile simpledisplay.d, I get the following:
C:\...\dlang\arsd-master>dmd -Lgdi32.lib -L user32.lib
simpledisplay.d color.d
Don't pass libraries with -L. Just do it like this:
dmd gdi32.lib user32.lib
Interestingly enough, simpledisplay.obj and simpledisplay.exe
are produced. Aren't errors fatal? The EXE is not a valid win32
application.
Those aren't errors. The linker thinks it has been passed a
couple of options that it doesn't understand, but it will still
proceed with the link.
I am used to makefiles. The author doesn't use dub for these
programs. (dub ~=make?)
gdi32.lib and user32.lib appear in multiple directories. I
added "C:\Program Files (x86)\Windows
Kits\8.1\Lib\winv6.3\um\x64" to %LIB% which seemed sensible to
do. I still get the warning:
OPTLINK : Warning 9: Unknown Option : NOIGDI32.LIBUSER32.LIB
See that OPTLINK in the error messages? That's the Digital Mars
linker that ships with DMD. It doesn't know anything at all about
the libraries that ship with the Windows kits. It uses the
libraries that ship with DMD. The Windows SDK is only used when
using the Microsoft linker, which only happens when passing -m64
or -m32mscoff to the compiler. By default (-m32), DMD uses
OPTLINK.
Again, just pass the libraries without -L.
So, I'm still figuring out how to set up a compile. I presume
that dmd is not finding gdi32.lib and user32.lib. What am I
missing?
Your bigger issue, and why your compilation didn't produce a
valid executable, is that you have no main function! Try
something like the following:
Directory tree:
- testapp
-- test1.d
--- arsd
---- simpledisplay.d
---- color.d
In test1.d, using an example copy/pasted from the simpledisplay.d
ddoc comments:
```
import arsd.simpledisplay;
import std.conv;
void main() {
auto window = new SimpleWindow(Size(500, 500), "My D App");
int y = 0;
void addLine(string text) {
auto painter = window.draw();
if(y + painter.fontHeight >= window.height) {
painter.scrollArea(Point(0, 0), window.width,
window.height, 0, painter.fontHeight);
y -= painter.fontHeight;
}
painter.outlineColor = Color.red;
painter.fillColor = Color.black;
painter.drawRectangle(Point(0, y), window.width,
painter.fontHeight);
painter.outlineColor = Color.white;
painter.drawText(Point(10, y), text);
y += painter.fontHeight;
}
window.eventLoop(1000,
() {
addLine("Timer went off!");
},
(KeyEvent event) {
addLine(to!string(event));
},
(MouseEvent event) {
addLine(to!string(event));
},
(dchar ch) {
addLine(to!string(ch));
}
);
}
```
Then run the compiler with:
dmd test1.d arsd/simpledisplay.d arsd/color.d gdi32.lib user32.lib
IIRC, you don't need to pass user32.lib, as DMD will link it in
by default (though I may be mistaken).