digitalmars.D - Linking with DMD
- Anonymous (54/54) Jun 21 2012 So I really think improvements could be made on how you link your
- Walter Bright (4/10) Jun 21 2012 main() cannot function as the start address of a program. Things must be...
- Walter Bright (2/4) Jun 21 2012 DLL files contain insufficient information to link successfully to them.
- Anonymous (2/8) Jun 21 2012 GCC (MinGW) is able to do this...
- Walter Bright (5/12) Jun 21 2012 For example, many names in Windows DLLs are:
- Anonymous (3/19) Jun 21 2012 But you declare it in your code like this:
- Timon Gehr (3/33) Jun 21 2012 If linking in the runtime is disabled explicitly, linker errors are to
So I really think improvements could be made on how you link your code when compiling it with DMD... I want to have the complete control over which libraries i link my program to... Actually, i'm not yet planning on using either phobos or tango. (I would maybe use one of those when i notice, that one of those libraries offers something that i would like to use, because otherwise my executable file would unnecessarily blow up in size, right?) So I ended up downloading the zip-archive of DMD and extracting only the parts i need: - Windows DMD without any lib files (only the contents of the \windows\bin\ folder) - druntime (object.d, ...) The folder which was the \windows\bin\ folder is now my main DMD folder I changed the sc.ini file so that it now only - looks for lib files in an empty "lib" folder i created inside this main DMD folder - imports the druntime source files (i exported everything inside /src/druntime/src/ into an "import" folder inside the main DMD folder and renamed object_.d to object.d) Now when i try to compile a file with only - a module name declaration - and an empty void main(){} function (without extern linking) it says: OPTLINK : Warning 23: No Stack Error 42: Symbol Undefined _main Error 42: Symbol Undefined __acrtused_con OPTLINK : Warning 134: No Start Address I would really like seeing this working... Also i would like to be able to link to DLL files directly without having to create or find matching lib files... So that i could write on the command line something like: dmd mysource.d C:\Windows\system32\kernel32.dll C:\WINXP\system32\Winmm.dll C:\WINXP\system32\Gdi32.dll And in my program i declare the functions i want to use with extern linkage without body. Is this somehow possible? I really like many things D offers like nested functions, closures, modules, how it doesn't pollute your namespace because of the possibilities you have when importing other modules... But i think the linking process still has to be cut down and made simple and straightforward. It works when I copy all the lib files from \windows\lib into my lib folder... so i guess it links to lib files which I haven't even specified on the command line. This should all be made much more straightforward... So that I can link only to the libraries i want to... And that I can link to them by simply specifying the DLL file... not having to find a matching lib file on the internet... Because otherwise i don't think D is much better than a bloated java virtual machine or stuff like that... So, I'm really curious about the opinions on that
Jun 21 2012
On 6/21/2012 10:48 AM, Anonymous wrote:it says: OPTLINK : Warning 23: No Stack Error 42: Symbol Undefined _main Error 42: Symbol Undefined __acrtused_con OPTLINK : Warning 134: No Start Address I would really like seeing this working...main() cannot function as the start address of a program. Things must be set up first, and __acrtused_con pulls in the code that does that. But that code must exist in a library.
Jun 21 2012
On 6/21/2012 10:48 AM, Anonymous wrote:And that I can link to them by simply specifying the DLL file... not having to find a matching lib file on the internet...DLL files contain insufficient information to link successfully to them.
Jun 21 2012
On Thursday, 21 June 2012 at 18:06:12 UTC, Walter Bright wrote:On 6/21/2012 10:48 AM, Anonymous wrote:GCC (MinGW) is able to do this...And that I can link to them by simply specifying the DLL file... not having to find a matching lib file on the internet...DLL files contain insufficient information to link successfully to them.
Jun 21 2012
On 6/21/2012 11:14 AM, Anonymous wrote:On Thursday, 21 June 2012 at 18:06:12 UTC, Walter Bright wrote:For example, many names in Windows DLLs are: _foo 16 which means there are 16 bytes worth of parameters. However, there's zero information on how many parameters there are or what their types are.On 6/21/2012 10:48 AM, Anonymous wrote:GCC (MinGW) is able to do this...And that I can link to them by simply specifying the DLL file... not having to find a matching lib file on the internet...DLL files contain insufficient information to link successfully to them.
Jun 21 2012
On Thursday, 21 June 2012 at 19:42:46 UTC, Walter Bright wrote:On 6/21/2012 11:14 AM, Anonymous wrote:But you declare it in your code like this: extern (Windows) int foo(int a, void* b, void* c, uint d);On Thursday, 21 June 2012 at 18:06:12 UTC, Walter Bright wrote:For example, many names in Windows DLLs are: _foo 16 which means there are 16 bytes worth of parameters. However, there's zero information on how many parameters there are or what their types are.On 6/21/2012 10:48 AM, Anonymous wrote:GCC (MinGW) is able to do this...And that I can link to them by simply specifying the DLL file... not having to find a matching lib file on the internet...DLL files contain insufficient information to link successfully to them.
Jun 21 2012
On 06/21/2012 07:48 PM, Anonymous wrote:So I really think improvements could be made on how you link your code when compiling it with DMD... I want to have the complete control over which libraries i link my program to... Actually, i'm not yet planning on using either phobos or tango. (I would maybe use one of those when i notice, that one of those libraries offers something that i would like to use, because otherwise my executable file would unnecessarily blow up in size, right?) So I ended up downloading the zip-archive of DMD and extracting only the parts i need: - Windows DMD without any lib files (only the contents of the \windows\bin\ folder) - druntime (object.d, ...) The folder which was the \windows\bin\ folder is now my main DMD folder I changed the sc.ini file so that it now only - looks for lib files in an empty "lib" folder i created inside this main DMD folder - imports the druntime source files (i exported everything inside /src/druntime/src/ into an "import" folder inside the main DMD folder and renamed object_.d to object.d) Now when i try to compile a file with only - a module name declaration - and an empty void main(){} function (without extern linking) it says: OPTLINK : Warning 23: No Stack Error 42: Symbol Undefined _main Error 42: Symbol Undefined __acrtused_con OPTLINK : Warning 134: No Start Address I would really like seeing this working... ...If linking in the runtime is disabled explicitly, linker errors are to be expected.
Jun 21 2012