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/fxdqpmfcbskvtcafz...@forum.dlang.org and some of the replies explain where things are headed and difficulties with C++ interoperability.

Reply via email to