C++ 库调用失败c++;动态链接库
vim文档声明我必须对所有函数使用C调用约定。 考虑到这一点,我写了一个最小的dll,看看是否一切正常C++ 库调用失败c++;动态链接库,c++,vim,dll,C++,Vim,Dll,vim文档声明我必须对所有函数使用C调用约定。 考虑到这一点,我写了一个最小的dll,看看是否一切正常 #include <string> std::string _declspec(dllexport) Meow() { std::string Meow = "Meow!"; return Meow; } 编译时没有任何问题,并将dll复制到我的vim目录中。 据我所知,通过调用函数 :call libcall("test.dll","Meow",0)<c
#include <string>
std::string _declspec(dllexport) Meow() {
std::string Meow = "Meow!";
return Meow;
}
编译时没有任何问题,并将dll复制到我的vim目录中。
据我所知,通过调用函数
:call libcall("test.dll","Meow",0)<cr>
:调用libcall(“test.dll”,“喵喵”,0)
应该有用。但我一直收到错误364:库调用“Meow()”失败。
将libcall中的.dll名称更改为不存在的名称会导致相同的错误,因此我得出结论,我的dll有问题。
但是我的dll编译时没有任何问题,
这让我感到困惑。我发现您的代码至少有两个问题:
-
<> LI>在导出时,C++名称通常会被损坏,所以您的<代码> MEOW函数将变成“代码>?喵@”?string@DU?$char_traits@D@性病病毒$allocator@D@2@@std@@XZ
- 似乎说明用
调用的函数必须符合一些相当严格的条件:libcall
我发现您的代码至少有两个问题:
-
<> LI>在导出时,C++名称通常会被损坏,所以您的<代码> MEOW函数将变成“代码>?喵@”?string@DU?$char_traits@D@性病病毒$allocator@D@2@@std@@XZ
- 似乎说明用
调用的函数必须符合一些相当严格的条件:libcall
以下内容将修复您的示例:
extern "C"
{
static char null_terminated_string[2048];
char* _declspec(dllexport) Meow(char *arg)
{
strncpy(null_terminated_string, arg, std::min(sizeof(null_terminated_string), strlen(arg));
return null_terminated_string;
}
}
以下内容将修复您的示例:
extern "C"
{
static char null_terminated_string[2048];
char* _declspec(dllexport) Meow(char *arg)
{
strncpy(null_terminated_string, arg, std::min(sizeof(null_terminated_string), strlen(arg));
return null_terminated_string;
}
}
哦,我看到将返回类型更改为字符指针,并添加了外部“C”以防止名称被破坏,它成功了。感谢Mateoohohh,我看到将返回类型更改为字符指针,并添加了外部“C”以防止名称被破坏,它成功了。谢谢,是不是应该是
extern“C”
?是不是应该是extern“C”
?