从第三方库导出cpp错位函数

时间:2019-07-10 07:06:03

标签: c++ visual-studio dllexport

我有一个第三方库作为源代码。它带有一个Visual Studio项目,可从中构建一个.lib。

虽然我想从C#访问功能,所以我复制了项目并更改了它以创建dll。

尽管DLL不包含任何导出的函数,所以我还创建了一个模块定义(.def)文件,并在EXPORTS部分中添加了我需要的函数。

这适用于extern "C"块中声明的所有功能。但是,我需要的某些功能在这些块的外部声明。

如果将它们添加到EXPORTS部分,则会出现错误LNK2001 unresolved external symbol XYZ:(

如果可以避免的话,我不想更改第三方库的源代码。

访问这些功能的最优雅,最简单的方法是什么?

修改

需要澄清的一点是:到目前为止,我想告诉我的接口中没有涉及C ++功能。老实说,我不明白为什么第三方作者不只是将剩余的几个功能包括在extern "C"块中。这些函数位于头文件的底部,也许添加这些函数的人犯了一个错误,并将其置于extern "C"块作用域之外。

1 个答案:

答案 0 :(得分:2)

对于C ++,一种方法(最恕我直言,恕我直言)将使用为此设计的C ++ / CLI。尤其是如果您不仅具有函数,还具有类。

您创建一个很薄的包装层,这很简单:

  1. 创建CLI类
  2. 放置原始类的成员实例
  3. 包装原始类中的所有公共方法

赞(未品尝):

C ++ nativ:

In [26]: try: 
    ...:     1/0 
    ...: except ZeroDivisionError: 
    ...:     print("Caught") 
    ...: try: 
    ...:     pass 
    ...: except ZeroDivisionError: 
    ...:     print("Caught Again")
Caught

CLI包装器:

// original c++ class
class Foo {
public:
    Foo(int v) : m_value(v) {}
    ~Foo() {}

    int  value()      { return m_value; }
    void value(int v) { m_value = v; }

private:
    int m_value;
};

Here,您会找到一个简短的方法,其中有更详细的说明。

编辑:

根据您的评论:

  

[...]尽管我从未使用过C ++ / CLI,但该语言看起来有些混乱。由于项目截止日期已经接近,所以我不确定是否有足够的时间来学习它。我一定会牢记这个选项!

如果您不是,正在寻找最优雅的方式(如您最初的问题),而是寻求最快/最短的方式:对于C ++,一种方式(恕我直言,最短的方式)将使用C ++ / CLI,就是为此而设计的。特别是如果您不仅具有函数,还具有类。您创建了一个非常简单的薄包装层... Here,您可以找到简短的方法(在10分钟之内),该方法对此进行了更详细的描述。