www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Trying to create a trivial 64 bit D Lang DLL on a Windows 10 machine

reply WhatMeWorry <kheaser gmail.com> writes:
module user;

export { int myAddSeven(int a, int b); }

void main()
{
     int total = myAddSeven(2, 3);
}


dmd -m64 -c user.d
module mydll; export extern(D) { int myAddSeven(int a, int b) { return a+b+7; } /* <-- function body */ }
dmd -c -shared -m64  mydll.d
link mydll.obj /DLL /NOENTRY
Microsoft (R) Incremental Linker Version 14.27.29111.0 Copyright (C) Microsoft Corporation. All rights reserved. Creating library mydll.lib and object mydll.exp
link user.obj /implib:mydll.lib
Microsoft (R) Incremental Linker Version 14.27.29111.0 Copyright (C) Microsoft Corporation. All rights reserved. LINK : fatal error LNK1104: cannot open file 'phobos64.lib' or when I give the linker phobos64.lib
link user.obj /implib:mydll.lib /LIBPATH:C:\D\dmd2\windows\lib64
Microsoft (R) Incremental Linker Version 14.27.29111.0 Copyright (C) Microsoft Corporation. All rights reserved. user.obj : error LNK2019: unresolved external symbol __imp__D4user10myAddSevenFiiZi referenced in function _Dmain phobos64.lib(stacktrace_1be8_3e5.obj) : error LNK2019: unresolved external symbol snprintf referenced in function _D4core3sys7windows10stacktrace10StackTrace13resolveNoSyncFAxmZAAa phobos64.lib(demangle_c96_79b.obj) : error LNK2001: unresolved external symbol snprintf phobos64.lib(parseoptions_e2c_21b.obj) : error LNK2001: unresolved external symbol snprintf phobos64.lib(parseoptions_e2c_21b.obj) : error LNK2019: unresolved external symbol sscanf referenced in function _D4core8internal12parseoptions5parseFNbNiAxaKANgaKfQkZb user.exe : fatal error LNK1120: 3 unresolved externals
Sep 29 2020
next sibling parent reply Ferhat =?UTF-8?B?S3VydHVsbXXFnw==?= <aferust gmail.com> writes:
On Tuesday, 29 September 2020 at 21:22:21 UTC, WhatMeWorry wrote:
 module user;

 export { int myAddSeven(int a, int b); }

 [...]
it is better to use this template https://github.com/dlang/dmd/tree/master/samples/mydll You don't have a DllMain.
Sep 30 2020
parent reply user1234 <user1234 12.de> writes:
On Wednesday, 30 September 2020 at 11:45:53 UTC, Ferhat Kurtulmuş 
wrote:
 On Tuesday, 29 September 2020 at 21:22:21 UTC, WhatMeWorry 
 wrote:
 module user;

 export { int myAddSeven(int a, int b); }

 [...]
it is better to use this template https://github.com/dlang/dmd/tree/master/samples/mydll You don't have a DllMain.
yeah that's the problem, check [0] OP. The author makes commercial dll on windows so he knows what he speaks about [0] https://forum.dlang.org/post/mscgsclxwtjcferfxoet forum.dlang.org
Oct 01 2020
parent reply WhatMeWorry <kheaser gmail.com> writes:
On Thursday, 1 October 2020 at 09:22:29 UTC, user1234 wrote:
 On Wednesday, 30 September 2020 at 11:45:53 UTC, Ferhat 
 Kurtulmuş wrote:
 On Tuesday, 29 September 2020 at 21:22:21 UTC, WhatMeWorry 
 wrote:
 module user;

 export { int myAddSeven(int a, int b); }

 [...]
it is better to use this template https://github.com/dlang/dmd/tree/master/samples/mydll You don't have a DllMain.
yeah that's the problem, check [0] OP. The author makes commercial dll on windows so he knows what he speaks about [0] https://forum.dlang.org/post/mscgsclxwtjcferfxoet forum.dlang.org
Yes, but shouldn't the /NOENTRY option take care of that. Say, I just want to make a DLL of simple functions.
Oct 01 2020
parent reply kinke <noone nowhere.com> writes:
On Thursday, 1 October 2020 at 20:03:19 UTC, WhatMeWorry wrote:
 Yes, but shouldn't the /NOENTRY option take care of that. Say, 
 I just want to make a DLL of simple functions.
Your little example has 2 problems, the first being an incompatible extern(D) ex/import (mydll.myAddSeven vs. user.myAddSeven) and the second being an incomplete/wrong linker cmdline. When changing the myAddSeven declarations to extern(C++) (another option being a mydll.di header for the import), it works with
 dmd -m64 -shared -L/NOENTRY mydll.d
 dmd -m64 user.d mydll.lib
For more details, see also https://wiki.dlang.org/Win32_DLLs_in_D.
Oct 01 2020
parent reply WhatMeWorry <kheaser gmail.com> writes:
On Thursday, 1 October 2020 at 20:28:58 UTC, kinke wrote:
 On Thursday, 1 October 2020 at 20:03:19 UTC, WhatMeWorry wrote:
 Yes, but shouldn't the /NOENTRY option take care of that. Say, 
 I just want to make a DLL of simple functions.
Your little example has 2 problems, the first being an incompatible extern(D) ex/import (mydll.myAddSeven vs. user.myAddSeven) and the second being an incomplete/wrong linker cmdline. When changing the myAddSeven declarations to extern(C++) (another option being a mydll.di header for the import), it works with
 dmd -m64 -shared -L/NOENTRY mydll.d
 dmd -m64 user.d mydll.lib
For more details, see also https://wiki.dlang.org/Win32_DLLs_in_D.
Thanks all. I've gotten it to work with:
dmd -m64 -ofmydll.dll  mydll.d  -L/NOENTRY -L/DLL
dmd -m64 user.d mydll.lib
user.exe
total = 12 But then I got cocky and decided to just added a writeln() in the mydll.d file and I've been fighting this link error ever since: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\bin\Hostx64\x64\link.exe /NOLOGO "mydll.obj" /OUT:"mydll.dll" /DEFAULTLIB:phobos64 /NOENTRY /DLL /OPT:NOICF /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\lib\x64" legacy_stdio_definitions.lib /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\ucrt\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x64" Creating library mydll.lib and object mydll.exp mydll.obj : error LNK2019: unresolved external symbol fwrite referenced in function _D3std5stdio__T13trustedFwriteTaZQsFNbNiNePOS4core4stdcQBx6_iobufxAaZm phobos64.lib(object_72_81a.obj) : error LNK2001: unresolved external symbol memcpy phobos64.lib(exception_cf4_fff.obj) : error LNK2001: unresolved external symbol memcpy phobos64.lib(bits_23fa_21c.obj) : error LNK2001: unresolved external symbol memcpy phobos64.lib(gc_2413_a4e.obj) : error LNK2001: unresolved external symbol memcpy phobos64.lib(gc_2415_a03.obj) : error LNK2001: unresolved external symbol memcpy phobos64.lib(gc_2478_432.obj) : error LNK2001: unresolved external symbol memcpy o o o
Oct 01 2020
parent reply Ferhat =?UTF-8?B?S3VydHVsbXXFnw==?= <aferust gmail.com> writes:
On Thursday, 1 October 2020 at 21:35:42 UTC, WhatMeWorry wrote:
 On Thursday, 1 October 2020 at 20:28:58 UTC, kinke wrote:
 [...]
Thanks all. I've gotten it to work with:
[...]
[...]
[...]
total = 12 [...]
1) try running your commands in Visual Studio Native x64 CMD. 2) try link with msvcrt.lib
Oct 01 2020
parent reply WhatMeWorry <kheaser gmail.com> writes:
On Thursday, 1 October 2020 at 21:56:46 UTC, Ferhat Kurtulmuş 
wrote:
 On Thursday, 1 October 2020 at 21:35:42 UTC, WhatMeWorry wrote:
 On Thursday, 1 October 2020 at 20:28:58 UTC, kinke wrote:
 [...]
Thanks all. I've gotten it to work with:
[...]
[...]
[...]
total = 12 [...]
1) try running your commands in Visual Studio Native x64 CMD.
Yes, I've been doing that.
 2) try link with msvcrt.lib
The only msvcrt.lib I can find on my Windows 10 machine is: "C:\Windows Kits\10\Lib\10.0.19041.0\um\x64\ntstc_msvcrt.lib" Also on Microsoft's docs https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-library-f atures?view=vs-2019 it talks about a ucrt.lib?
Oct 02 2020
parent reply Ferhat =?UTF-8?B?S3VydHVsbXXFnw==?= <aferust gmail.com> writes:
On Friday, 2 October 2020 at 07:34:03 UTC, WhatMeWorry wrote:
 On Thursday, 1 October 2020 at 21:56:46 UTC, Ferhat Kurtulmuş 
 wrote:
 On Thursday, 1 October 2020 at 21:35:42 UTC, WhatMeWorry wrote:
 On Thursday, 1 October 2020 at 20:28:58 UTC, kinke wrote:
 [...]
Thanks all. I've gotten it to work with:
[...]
[...]
[...]
total = 12 [...]
1) try running your commands in Visual Studio Native x64 CMD.
Yes, I've been doing that.
 2) try link with msvcrt.lib
The only msvcrt.lib I can find on my Windows 10 machine is: "C:\Windows Kits\10\Lib\10.0.19041.0\um\x64\ntstc_msvcrt.lib" Also on Microsoft's docs https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-library-f atures?view=vs-2019 it talks about a ucrt.lib?
Here are the steps I used with success: in a VCx64 cmd -> set PATH=%PATH%;D:\dlang\dmd.2.094.0.windows\dmd2\windows\bin64 ------------------------ module user; import std.stdio; import mydll; // Yes, I imported the dll here //export { int myAddSeven(int a, int b); } void main() { int total = mydll.myAddSeven(2, 3); writeln(total); } ------------------------- module mydll; export extern(D) { int myAddSeven(int a, int b) { return a+b+7; } /* <-- function body */ } --------------------------- dmd -m64 -ofmydll.dll mydll.d -L/NOENTRY -L/DLL dmd -m64 user.d mydll.lib
Oct 02 2020
parent reply Imperatorn <johan_forsberg_86 hotmail.com> writes:
On Friday, 2 October 2020 at 08:07:33 UTC, Ferhat Kurtulmuş wrote:
 On Friday, 2 October 2020 at 07:34:03 UTC, WhatMeWorry wrote:
 On Thursday, 1 October 2020 at 21:56:46 UTC, Ferhat Kurtulmuş 
 wrote:
 On Thursday, 1 October 2020 at 21:35:42 UTC, WhatMeWorry 
 wrote:
 [...]
1) try running your commands in Visual Studio Native x64 CMD.
Yes, I've been doing that.
 2) try link with msvcrt.lib
The only msvcrt.lib I can find on my Windows 10 machine is: "C:\Windows Kits\10\Lib\10.0.19041.0\um\x64\ntstc_msvcrt.lib" Also on Microsoft's docs https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-library-f atures?view=vs-2019 it talks about a ucrt.lib?
Here are the steps I used with success: in a VCx64 cmd -> set PATH=%PATH%;D:\dlang\dmd.2.094.0.windows\dmd2\windows\bin64
Did you create a D-partition just for D. Pro
Oct 02 2020
next sibling parent Ferhat =?UTF-8?B?S3VydHVsbXXFnw==?= <aferust gmail.com> writes:
On Friday, 2 October 2020 at 08:33:25 UTC, Imperatorn wrote:
 On Friday, 2 October 2020 at 08:07:33 UTC, Ferhat Kurtulmuş 
 wrote:
 On Friday, 2 October 2020 at 07:34:03 UTC, WhatMeWorry wrote:
 On Thursday, 1 October 2020 at 21:56:46 UTC, Ferhat Kurtulmuş 
 wrote:
 [...]
Yes, I've been doing that.
 [...]
The only msvcrt.lib I can find on my Windows 10 machine is: "C:\Windows Kits\10\Lib\10.0.19041.0\um\x64\ntstc_msvcrt.lib" Also on Microsoft's docs https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-library-f atures?view=vs-2019 it talks about a ucrt.lib?
Here are the steps I used with success: in a VCx64 cmd -> set PATH=%PATH%;D:\dlang\dmd.2.094.0.windows\dmd2\windows\bin64
Did you create a D-partition just for D. Pro
Haha. Yes my c compiler is also located at c:\c
Oct 02 2020
prev sibling parent rikki cattermole <rikki cattermole.co.nz> writes:
On 02/10/2020 9:33 PM, Imperatorn wrote:
 Did you create a D-partition just for D. Pro
You can mount directories as a drive on Windows. https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/subst
Oct 02 2020
prev sibling parent =?UTF-8?B?0JLQuNGC0LDQu9C40Lkg0KTQsNC0?= =?UTF-8?B?0LXQtdCy?= writes:
On Tuesday, 29 September 2020 at 21:22:21 UTC, WhatMeWorry wrote:
 module user;

 export { int myAddSeven(int a, int b); }

 [...]
As example, DLL: https://github.com/vitalfadeev/dlang-dll
Oct 01 2020