Interfacing D with C and C++

Scott Wilson via Digitalmars-d digitalmars-d at puremagic.com
Sat Aug 23 21:31:55 PDT 2014


Thank you all for responding. I have run the following 
experiment. Trying to call a method of std::allocator<int> I am 
sure I am doing something wrong. Please do tell and apologies for 
my noobiness.

// test.d
extern(C++, std)
{
     struct allocator(T)
     {
         alias size_type = size_t;
         void deallocate(void*, size_type);
     }
}

void testing(std.allocator!int * pa)
{
     pa.deallocate(null, 0);
}

void main(string[] args)
{
}
// end of test.d

There must be an object file in C++ to link. I wrote.

// test.cpp
#include <memory>
template struct std::allocator<int>;
// end of test.cpp

Commands used were

g++ -c test2.cpp
dmd test.d test2.o

There are these errors

Undefined symbols for architecture x86_64:
   "std::allocator<int>::deallocate(void*, unsigned long)", 
referenced from:
       _D4test3funFPS4test3std16__T9allocatorTiZ9allocatorZv in 
test.o
   "operator delete(void*)", referenced from:
       std::__1::allocator<int>::deallocate(int*, unsigned long) 
in test2.o
   "operator new(unsigned long)", referenced from:
       std::__1::allocator<int>::allocate(unsigned long, void 
const*) in test2.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to 
see invocation)
--- errorlevel 1

To zero in on the matter I wrote the implementation by hand. 
Changed test2.cpp with

// test2.cpp
namespace std
{
     template <class T> struct allocator
     {
         void deallocate(void*, unsigned long) {}
     };
     template struct allocator<int>;
}
// end of test2.cpp

Only fewer errors.

Undefined symbols for architecture x86_64:
   "std::allocator<int>::deallocate(void*, unsigned long)", 
referenced from:
       _D4test3funFPS4test3std16__T9allocatorTiZ9allocatorZv in 
test.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to 
see invocation)
--- errorlevel 1

Could you tell me how I could get this to work?


Scott

On Sunday, 24 August 2014 at 02:32:22 UTC, bachmeier wrote:
> On Saturday, 23 August 2014 at 22:46:11 UTC, Scott Wilson wrote:
>> Hello, world. Brand new poster here though I posted similar 
>> messages in other language forums. I hope this is the right 
>> place to ask because my question is half about existing stuff 
>> and half about prospective work.
>>
>> I am considering starting with D amid a C++ code base. New D 
>> code would need to somehow integrate with the existing C++ 
>> code. The C++ code is the expected melange of free functions, 
>> classes, what have you and uses STL and Boost (also other libs 
>> less prominently). Allow me to ask:
>>
>> 1. What is the current support for calling C/C++ free 
>> functions from D? What level of mangling is supported? What 
>> data types can be passed without translation from D to C/C++?
>>
>> 2. How about template functions? Is it possible to call a C++ 
>> template function from D?
>>
>> 3. How can a C++ object be used from D? Can C++ methods be 
>> called from D? The question applies to value types - no 
>> virtuals - and polymorphic types with virtuals, inheritance 
>> etc. And of course simple C structs.
>>
>> 4. How about template objects? One issue is that many C++ 
>> interfaces pass std::string and std::map<..., ...> as 
>> parameters. How feasible is to manipulate such objects in D?
>>
>> 5. How about the other way? Can a C/C++ function call a D 
>> function?
>>
>> I would appreciate any pointers you have to how-to materials. 
>> In equal measure I am interested in plans to address such 
>> issues in the foreseeable future. Thankyou.
>>
>>
>> Scott
>
> I'm only able to answer (5). I regularly create shared 
> libraries on Linux and call them from C. It's very simple (for 
> what I've done anyway). The info on this page 
> http://dlang.org/interfaceToC should get you started. 
> http://dlang.org/dll-linux.html#dso9 explains compilation. 
> http://forum.dlang.org/group/digitalmars.D.learn is a friendly 
> place to ask if you've got questions.
>
> This recent post 
> http://forum.dlang.org/post/fxdqpmfcbskvtcafzfcp@forum.dlang.org 
> and some of the replies explain where things are headed and 
> difficulties with C++ interoperability.



More information about the Digitalmars-d mailing list