On Tue, Apr 10, 2012 at 7:46 PM, Jonathan M Davis <span dir="ltr"><<a href="mailto:jmdavisProg@gmx.com">jmdavisProg@gmx.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
This stackoverflow question raises an interesting issue with linking order and<br>
dmd:<br>
<br>
<a href="http://stackoverflow.com/questions/10095150/std-net-curl-linker-errors-in-linux" target="_blank">http://stackoverflow.com/questions/10095150/std-net-curl-linker-errors-in-linux</a><br>
<br>
I don't know if it's this way on Linux machines in general, but the OP had to<br>
link his program manually to be able to use std.curl. dmd appears to put the -<br>
L argument before any of its own linker arguments, and in this case, the<br>
linking argument for curl needs to go on the end.<br>
<br>
So, my question is whether dmd should be changed to put any -L arguments<br>
passed to it after the arguments that it passes to the linker itself. I'm far<br>
from an expert on this and am quite surprised that the order of arguments to<br>
the linker matters, but since it does, it seems to me that we should find the<br>
optimal order for dmd to use if we can, since it's not terribly user friendly<br>
to force people to call gcc or ld directly rather than using dmd to link just<br>
because they want to pass an argument to the linker. That's what the -L flag is<br>
supposed to be for.<br>
<span class="HOEnZb"><font color="#888888"><br>
- Jonathan M Davis<br>
</font></span></blockquote></div><br><div>That was my Stack Overflow question.  I was getting fairly frustrated and only figured out how to fix it through a lucky guess. Other new users to D on Linux might not be so lucky and give up.  I'm certainly no expert on linking but the fix for this sounds as simple as just tacking the command line arguments on the end rather than at the beginning.  This really only needs to happen with libraries phobos uses (like libcurl) though.</div>
<div><br></div><div>Looking in link.c in dmd I see the comment:</div><div><div><br></div><div>    /* Standard libraries must go after user specified libraries</div><div>     * passed with -l.</div><div>     */</div></div>
<div><br></div><div>Which, if the git blame is correct, was written by Brad Roberts so maybe he knows why this is the case.  Further down it makes reference to the fact that librt must be linked after phobos2 on Ubuntu 11.10 so the link order issue is acknowledged with respect to that one library.</div>
<div><br></div><div>It appears to be simple enough to change the order to fix the issue I experienced (even *I* could make such a pull request) but without knowing the reasoning behind that source comment I don't feel comfortable messing with it.</div>
<div><br></div><div><div>Even better from a user standpoint would be linking libcurl in by default without requiring the user to specify it themselves.  There is, of course, the issue that D should not require libcurl to be on a system.  It seems unfortunate that ld doesn't seem to have a "link this library if it can be found, otherwise continue without error" option (though there are, no doubt, issues with this that I'm just not knowledgeable enough to know about).</div>
</div><div><br></div><div>Regards,</div><div>Brad Anderson</div>