What is the wrong with my C++ interfacing
Ferhat Kurtulmuş
aferust at gmail.com
Mon Mar 16 09:24:41 UTC 2020
On Monday, 16 March 2020 at 07:46:00 UTC, drug wrote:
> On 3/16/20 10:11 AM, Ferhat Kurtulmuş wrote:
>> On Sunday, 15 March 2020 at 22:25:27 UTC, Arine wrote:
>>> On Sunday, 15 March 2020 at 21:27:32 UTC, Ferhat Kurtulmuş
>>
>>> extern(C++, cv){
>>> extern(C++, class) struct Size_(_Tp){
>>> @disable this();
>>> ~this() { }
>>>
>>> final _Tp area() const;
>>> final double aspectRatio() const;
>>> final bool empty() const;
>>>
>>> _Tp width; //!< the width
>>> _Tp height; //!< the height
>>> }
>>> }
>>>
>>> extern(C++){
>>> cv.Size_!int* createSizeIntWH(int w, int h);
>>> }
>>>
>>> void main()
>>> {
>>> Size_!int* sz = createSizeIntWH(200, 100);
>>> writeln(sz.width);
>>> }
>>
>> This worked for me too. But member functions are still causing
>> linker error. It seems like docs
>> (https://dlang.org/spec/cpp_interface.html) do not cover those
>> situations. Is there any other sources to read for it. Maybe
>> you make a pull request to docs covering C++ interfacing tips
>> in detail.
>
> Not tested:
>
> extern(C++, class) struct Size_(_Tp){
> @disable this();
> ~this() { }
> extern(C++): // <- IIRC linkage should be set for members
> separately from aggregate
> final _Tp area() const;
> final double aspectRatio() const;
> final bool empty() const;
>
> _Tp width; //!< the width
> _Tp height; //!< the height
> }
Ok, here is a solution. I opened my lib (yielded by my auxilary
cpp) using 7zip. There are two files containing symbol names,
1.txt and 2.txt. I searched for names of member functions. They
were not there because c++ compiler does not compile member
functions of class templates because we don't actually use them.
So, I simply include this line in my aux cpp file and recompiled
it:
template class cv::Size_<int>;
I reopened 1.txt and they are there now:
?area@?$Size_ at H@cv@@QEBAHXZ
?aspectRatio@?$Size_ at H@cv@@QEBANXZ
now everything works :D
More information about the Digitalmars-d-learn
mailing list