Thread overview
LNK2019 error in the C++ interface
Sep 03
dokutoku
2 days ago
dokutoku
2 days ago
Mike Parker
2 days ago
kinke
September 03
I tried to use a function from a library written in C++ in D. I've been trying to use it in D. But I got an error in LNK2019 and the build failed.

So I created a simple static library as follows and built it.

```cpp
#pragma once

#include <windows.h>

namespace static_test {
	void str_test(LPCSTR str)
	{
		MessageBoxA(NULL, str, NULL, MB_OK);
	}

	void wstr_test(LPCWSTR str)
	{
		MessageBoxW(NULL, str, NULL, MB_OK);
	}

	void rect_test(RECT rect)
	{
	}
}
```

```d
import core.sys.windows.windows;
import std.utf;

extern (C++, "static_test") {
	nothrow @nogc
	extern void str_test(LPCSTR str1);

	nothrow @nogc
	extern void wstr_test(LPCWSTR str1);

	nothrow @nogc
	void rect_test(RECT rect);
}

void main()
{
	str_test(toUTFz!(const char*)("test"));

	// error LNK2019
	wstr_test(toUTF16z("test"w));

	// error LNK2019
	rect_test(RECT.init);
}
```

The LNK2019 error still occurred.
I'm guessing that the reason for the error is that the type declared in C++ is different from the type declared in D. But I'm not sure how to fix it.
2 days ago

It's been a while since then, but the problem with the structure has been solved.
The reason seems to be that the structure name defined in core.sys.windows.windef was not tagRECT.
I was able to get it to compile by adding a custom definition as follows

extern (C)
struct tagRECT
{
	LONG left;
	LONG top;
	LONG right;
	LONG bottom;
}

alias RECT = tagRECT;

The type name did not work.
The reason seems to be that WCHAR should be mangled with wcha_t, but it is mangled with chat16_t.
Since the mangle is wchat_t, I thought maybe I should use wchar_t in core.stdc.stdef, so I changed LPCWSTR to const (wchar_t)*, but that didn't work either.

I still haven't solved this problem.
I also took a look at Data Type Compatibility in Interfacing to C++, and I think it's wrong about wchar_t.

https://dlang.org/spec/cpp_interface.html#data-type-compatibility

2 days ago

On Thursday, 10 June 2021 at 13:19:34 UTC, dokutoku wrote:

>

I still haven't solved this problem.

Not sure if this is the issue, but you don't need extern on these. You already have the extern(C++) thing at the top of the file.

	extern void str_test(LPCSTR str1);

	nothrow @nogc
	extern void wstr_test(LPCWSTR str1);
2 days ago

On Thursday, 10 June 2021 at 13:19:34 UTC, dokutoku wrote:

>

The reason seems to be that WCHAR should be mangled with wcha_t, but it is mangled with chat16_t.

Confirmed: https://issues.dlang.org/show_bug.cgi?id=22014

Wrt. tagRECT, this should come in handy (for a druntime fix): https://dlang.org/changelog/2.097.0.html#pragma-mangle-aggregate