Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 库调用失败c++;动态链接库_C++_Vim_Dll - Fatal编程技术网

C++ 库调用失败c++;动态链接库

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

vim文档声明我必须对所有函数使用C调用约定。 考虑到这一点,我写了一个最小的dll,看看是否一切正常

#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
    调用的函数必须符合一些相当严格的条件:
函数必须只接受一个参数,要么是字符指针,要么是长整数,并且必须返回字符指针或NULL。返回的字符指针必须指向在函数返回后仍然有效的内存(例如DLL中的静态数据)


我发现您的代码至少有两个问题:

    <> LI>在导出时,C++名称通常会被损坏,所以您的<代码> MEOW函数将变成“代码>?喵@”?string@DU?$char_traits@D@性病病毒$allocator@D@2@@std@@XZ
  • 似乎说明用
    libcall
    调用的函数必须符合一些相当严格的条件:
函数必须只接受一个参数,要么是字符指针,要么是长整数,并且必须返回字符指针或NULL。返回的字符指针必须指向在函数返回后仍然有效的内存(例如DLL中的静态数据)


以下内容将修复您的示例:

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”