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