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).




Reply via email to