March 16, 2020 Re: What is the wrong with my C++ interfacing | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ferhat Kurtulmuş | 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
}
|
March 16, 2020 Re: What is the wrong with my C++ interfacing | ||||
---|---|---|---|---|
| ||||
Posted in reply to drug | 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_@H@cv@@QEBAHXZ ?aspectRatio@?$Size_@H@cv@@QEBANXZ now everything works :D |
March 16, 2020 Re: What is the wrong with my C++ interfacing | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ferhat Kurtulmuş | On 3/16/20 12:24 PM, Ferhat Kurtulmuş wrote:
>
> 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_@H@cv@@QEBAHXZ
> ?aspectRatio@?$Size_@H@cv@@QEBANXZ
>
> now everything works :D
>
Would be nice if you update wiki ;)
|
March 16, 2020 Re: What is the wrong with my C++ interfacing | ||||
---|---|---|---|---|
| ||||
Posted in reply to drug | On Monday, 16 March 2020 at 09:28:15 UTC, drug wrote:
> On 3/16/20 12:24 PM, Ferhat Kurtulmuş wrote:
>>
>> 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_@H@cv@@QEBAHXZ
>> ?aspectRatio@?$Size_@H@cv@@QEBANXZ
>>
>> now everything works :D
>>
>
> Would be nice if you update wiki ;)
It would be better for someone more experienced to do this ;)
|
Copyright © 1999-2021 by the D Language Foundation