On Tuesday, 27 September 2016 at 10:46:23 UTC, Johan Engelen wrote:
On Monday, 26 September 2016 at 23:32:05 UTC, Walter Bright wrote:
Linking C libraries and object code into D programs has always worked easily in D. The other way around, not so well.

[snip]

How much of an issue is this with D? Is it something we need to address?

We've been toying with this in setting up LDC's build such that it works on different platforms. […] We've now moved to using the system linker separately to do the linking.

To clarify: What we are doing in LDC is of course not what was suggested in the initial post, i.e. linking D object files into C executables without any (explicit) druntime dependencies and expecting this to work.

The problem we were facing in particular is that many C/C++ libraries (such as LLVM) come with a list of linker flags to use in the form of pkg-config or a similar tool. These will usually be formatted for the default way of linking C on the system (i.e. through a gcc-compatible interface). Thus, you can't just prefix them with -L and forward them to the D compiler since that forwards them directly to the low-level linker (-Xlinker, …).

This is a problem which *every* D project that wants to seamlessly link against system C libraries on Linux needs to solve.

There are two obvious ways to improve the situation:
- Like Johan suggested, add a D compiler flag that prints the default linker flags used to create D executables. - Add a D compiler flag to forward flags directly to the linker driver used, without using -Xlinker.

Unfortunately, the LDC build system of course needs to work with existing host compilers anyway, so these wouldn't have helped us with shipping the first DDMD-based version. The most robust solution I could come up with was to extract the linker command line used from `$DMD -v some_test_executable.d` to then pass the same flags directly to the system gcc when building the D program.

 — David

Reply via email to