Mixed VisualD/C++ project

Rainer Schuetze r.sagitario at gmx.de
Thu Jul 12 07:03:27 UTC 2018



On 06/07/2018 17:23, Mr.Bingo wrote:
> Seems to be a bit weak. I just get a D hello world without any cross 
> compilation. For the project, it would be better to have it setup to 
> work properly using C++ as the master, since the other D projects 
> provide the D side.
> 
> I was going to play around with using C++ and D together to see if I 
> could get the best of both worlds but the test project only provides a 
> bare bones D file. I created a cpp file and added it but I Get the error 
> about stdafx. Seems like the project is not really setup properly to 
> demonstrate using C++ and D together.
> 
> It would be better to have a small "hello world" mixed language demo.

Good idea. I'll try adding an option to the project wizard that adds a 
C++ source file containing main.

> 
> In fact, what I'd like to ultimately do is provide a QT gui using C++ 
> but a D business end.
> 
> The C++ file is programmed to use pre-compiled headers. Setting it to 
> 'create' still has issues since none of the pch plumbing is taken care of.
> 
> I turned off precompiled headers and modified the code:
> 
> #include <cstdio>
> 
> void main()
> {
> 
>      printf("hello world");
>      getchar();
> }
> 
> 
> which gets the c++ called(renaming the D main to something else).
> 
> 
> by externing and such I can call the D function after initializing the 
> runtime.
> 
> 
> 
> This is the basic code I have now:
> 
> 
> module WindowsApp2;
> 
> import std.stdio;
> extern(C) int rt_init();
> extern(C) int rt_term();
> 
> extern(C++) void test()
> {
>      rt_init();
>      writeln("Hello D World!\n");
>      getchar();
> 
>      rt_term();
> }
> 
> 
> and
> 
> 
> #include <cstdio>
> 
> 
> void test();
> 
> void main()
> {
> 
>      printf("hello world");
>      test();
>      getchar();
> }
> 
> 
> 
> 
> This is what I'd like to see:
> 
> A C++/D mixed project with either the C++ or D as "master"(I believe 
> this is just which one defines main) with proper initialization and 
> pre-compiled headers. The above is a crude approximation of trying to do 
> all that, but I'd expect it to be properly done.
> 
> The idea would be to provide the proper foundation of doing C++ and D 
> mixed projects where very little trouble occurs and one can get the full 
> benefit of each language and they interact well.

I'd expect rt_init/rt_exit to be called from C++ main, so you can don't 
need special D functions to be callable.


> 
> One of the key issues I think will occur, but not sure since I haven't 
> done much C++ and D mixed, is cross referencing symbols and a lot of 
> duplicate code must be created so the C++ side can see in to D and vice 
> versa.
> 
> Maybe a tool can be automated that will take the D exports and 
> automatically bring them in to C++ in a nice and easy way rather than 
> duplicating code.
> 
> Maybe you could get some help of some people that do mixed C++ and D 
> code to provide an optimal solution that works well? It would be cool if 
> one could use C++ and D easily so that little work has to be done. This 
> would alleviate many issues that D faces dealing with lack of proper 
> libraries that are in C++. (while bindings exist they they generally rot 
> over time and don't have all the flexibility that the main version has).
> 
> 
> Also, it might be ideal to focus on such a mixed project and have the 
> ability to simply set D as the "main" host. In such cases the project 
> would reduce to a basic D project with the capabilities of adding C++ 
> code. Even if C++ is master, which would require a c++ compiler, it can 
> act just as a wrapper. (If Visual D can detect that no C++ file is used 
> then it can ignore it)
> 
> 
> The biggest thing that worries me is having to do all the plumbing 
> between the two, which seems like it could be problematic for large 
> projects... and it seems like a lot of this stuff could be automated.
> 
> e.g.,
> 
>     module testmod;
> 
>     extern(C++) test();
> 
> exports, from D, test.  In C++ we have to include test:
> 
>     void test();
> 
> this is not too much work, although it creates a dependency(if test is 
> renamed then we have to rename all locations).
> 
> A few ways to solve this is to have visual D generate a list of all 
> extern(C++) exports(or even use attributes to select them specifically) 
> and then be able to import them in to C++
> 
>     #include "D_CppExports.h"
> 
> and D_CppExports.h is automatically created and includes void test();
> 
> This is not the best solution though as it would contain all the 
> functions, might base it off the names of the modules:
> 
>     #include "D_CppExports_testmod.h"
> 
> 
> Which, since it is automatically generated reduces the dependency issues 
> significantly. (only if the module name changes will the break occur, 
> which is an easy manual fix)
> 
> There might be better ways of doing this stuff, Some interlanguage 
> libraries might be useful, for example, using a D template in C++ 
> somehow and vice versa. (not sure if it is entirely possible but it 
> would work in some cases)
> 
> With such a project that can act both as a C++ host and a D host there 
> is really no need for the other project type. Allow for GDC in the 
> project too.

I haven't seen a recent GDC for Windows, and it has never outputting 
object files that integrate with VC and the MS linker.

> Just throwing out ideas... I'm hoping getting in to the mixed side of 
> things will open a lot of doors but I'm a bit weary it might be a lot 
> more trouble than it's worth:
> 
> For example, https://dlang.org/spec/cpp_interface.html
> 
> using a D class E in C++ requires code duplication:
> 
> class E
> {
>    public:
>      virtual int bar(int i, int j, int k);
> };
> 
> 
> it would be nice if Visual D could generate the C++ mapping 
> automatically and then make it easy to import similar to the example 
> above that imports a function.
> 
> 
> Doing stuff like this reduces dependencies between the C++ and D side so 
> that when one changes something on the D side they don't have to always 
> go back and change it on the C++ side(which, at some point will become 
> overwhelming). Instead, a simple utility handles all these dependencies 
> in some way.

While easier interop without duplication between D and C++ is desirable, 
it's not a simple task. I expect that most often the C++ side is 
available, and the D side needs to be generated. There are several 
projects trying to do this, but none is perfect so far:

https://code.dlang.org/packages/dpp/~master
https://github.com/jacob-carlborg/dstep
https://github.com/Syniurge/Calypso

Visual D has it's own tool, but it is very much targeted at converting 
the Windows SDK and Visual Studio SDK.


More information about the Digitalmars-d-ide mailing list