1

可能重复:
C++ 类及其成员函数的名称修改?

我创建了一个 Visual C++ dll。它正在工作,我可以通过 c# 中的这个 dll 从 cuda 调用我的 Thrust 方法。

唯一的问题是,我无法解开函数名称。我想要正常的名称,所以我不需要使用符合约定的入口点。

这是我的代码。这是我的标题

//ThrustCH.h
    #pragma once
    enter code here__declspec(dllexport) class ThrustFuncs 
    {
        __declspec(dllexport) static int maxValueThrust(int *data, int N);
        __declspec(dllexport) static double maxValueThrust(double *data, int N);
        __declspec(dllexport) static int* sort(int* data, int N);
        __declspec(dllexport) static double* sort(double* data, int N);
        __declspec(dllexport) static int simple(int N);
    };

这是我的cp

// thrustDLL.cpp : Defines the exported functions for the DLL application.
//

#include "stdafx.h"
#include "thrustH.h"
#include "thrustCH.h"

extern "C" {
    __declspec(dllexport) int ThrustFuncs::maxValueThrust(int *data, int N){
        return thrustH::maxValue(data,N);
    }

    __declspec(dllexport) double ThrustFuncs::maxValueThrust(double *data, int N){
        return thrustH::maxValue(data,N);
    }

    __declspec(dllexport) int* ThrustFuncs::sort(int* data, int N){
        return thrustH::sort(data,N);
    }
    __declspec(dllexport) double* ThrustFuncs::sort(double* data, int N){
        return thrustH::sort(data,N);
    }
    __declspec(dllexport) int ThrustFuncs::simple(int N){
        return N;
    }
}

我几乎在任何地方都尝试使用 extern "C" 和 __declspec(dllexport) 我想我做错了什么。请问你能帮帮我吗?

4

2 回答 2

3

您似乎正在尝试导出 C++ 函数,但希望它们具有 C 名称。

没有直接的方法可以做到这一点,主要是因为它没有意义。

C没有类(或命名空间),这些通常涉及 C++ 名称修改。也就是说,不要在声明中使用C名称修饰来编写您打算导出的函数。class

但是,您仍然可以编写 C 函数(在一个extern "C"块中),在其中调用您的 C++ 函数、方法或类。

就像是:

class foo
{
  static int bar(const std::string& str) { return static_cast<int>(str.size()); }
}

extern "C"
{
  int bar(const char* str)
  {
    // Call C++ version of the function.
    try
    {
      return foo::bar(str);
    }
    catch (std::exception&)
    {
      // Handle it somehow
    }
  }
}
于 2012-08-03T14:49:25.117 回答
0

您可能希望__cdecl用于要导出的不会破坏名称的函数。

参考:/Gd、/Gr、/Gz(调用约定)

于 2012-08-03T14:49:12.417 回答