On Tuesday, 1 May 2012 at 17:34:23 UTC, Regan Heath wrote:
I'm not sure if any of this is helpful but I've had a tinker
and had some
measure of success :p
I think you have the following issues to resolve:
1. When you build the lib, you need to tell it that the
progMain symbol is
to be found 'extern'ally.
2. When you build the exe, you have to make sure the linker
goes looking
for WinMain and not main /and/ that it looks in the lib for it.
I've managed to get something "working" but it's not what you
want (but it
might help you get there) and it's not pretty...
1. Add the following line to mylib.d:
extern(C) int progMain();
This tells dmd that when it compiles mylib.d the
symbol progMain
is
to
be found externally, and it's C linkage (I tried D linkage, but
this
prepends "MyLib" to the symbol it searches for).
2. Modify test.d and make it read:
extern(C)
void progMain() {
This makes progMain a C linkage symbol, which the
linker will
find
and
use.
3. Compile mylib.d with:
dmd -c mylib
(I know, this doesn't build a lib more on that
later..)
4. Compile test.d with:
dmd -c test
5. Run link.exe manually, e.g.
<path to dmd bin>\link.exe
test+mylib,,nul,phobos+user32+kernel32/noi;
This produces a test.exe which runs and executes
progMain from
test.d.
Initially I was trying to get it working with a lib but I got
dead-ended.
Using the code changes I mentioned above, and a test.def which
reads:
EXETYPE NT
SUBSYSTEM WINDOWS
If you go:
dmd -lib mylib
dmd -c test
link.exe
test,,nul,mylib+phobos+user32+kernel32/noi,test.def;
you get:
OPTLINK : Warning 134: No Start Address
I think that the reason for this is that test.obj does not
define an entry
point, see:
http://www.digitalmars.com/ctg/OptlinkErrorMessages.html
(No Start Address)
This implies it is looking for entry points in object files,
and perhaps
that means /not/ libs?? Not sure.
So, I tried to re-use my earlier extern trick adding:
extern(Windows)
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR
lpCmdLine,
int nCmdShow);
to test.d, but that gave the same results.
References..
http://dlang.org/windows.html
http://www.digitalmars.com/ctg/optlink.html
https://github.com/AndrejMitrovic/DWinProgramming
Thank you very much for the input, I tried to do what you said
and followed your instructions and went through link.exe and did
get a successful compile. What you have done does work (tested it
by omitting the .def file in link to get the console window and
did a writeln in WinMain for mylib AND progMain for test and it
does work (both wrileln's from WinMain and progMain print to
console) :-). This is pretty much what I wanted, yet it is still,
as you put it "not pretty", and making a lib for it isn't
working. It's a bit late here, so I'll tinker around tomorrow or
the day after with this and see if I can get towards more of a
cleaner way of doing this, I'll post back here with what I find.
Once again thank you, this seems like a nudge in the right
direction.
-Rowan