首页 > 解决方案 > 从第 3 方库中导出 cpp 错位函数

问题描述

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

我想从 C# 访问功能,所以我复制了项目并将其更改为创建一个 dll。

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

extern "C"这适用于在块中声明的所有函数。但是,我需要的一些函数是在这些块之外声明的。

如果我将这些添加到 EXPORTS 部分,我会收到错误LNK2001 unresolved external symbol XYZ:(

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

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

编辑

还有一点需要澄清:据我所知,我想公开的接口中不涉及 C++ 功能。老实说,我不明白为什么第 3 方作者不只是将剩余的少数功能包含在extern "C"块中。这些函数位于头文件的底部,也许添加它们的人只是犯了一个错误并将它们放在extern "C"块范围之外。

标签: c++visual-studiodllexport

解决方案


对于 C++ 一种方式(恕我直言,最优雅的方式)是使用为此设计的 C++/CLI。特别是如果你不仅有函数还有类。

您创建了一个相当简单的薄包装层:

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

像这样(未经测试):

C++ 原生:

// 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;
};

CLI 包装器:

// C++/CLI wrapper
ref class FooWrap
{
public:
    FooWrap(int v) { m_instance = new Foo(v); }
    !FooWrap()     { delete m_instance; }
    ~FooWrap()     { this->!FooWrap(); }

    property int value {
        int  get()      { return m_instance->value(); }
        void set(int v) { m_instance->value(v); }
    }

private:
    Foo *m_instance;
};

在这里您可以找到一个简短的操作指南,其中对其进行了更详细的描述。

编辑:

从您的评论中:

[...] 不过,我从未使用过 C++/CLI,而且这种语言看起来有点混乱。由于项目截止日期非常接近,我不确定是否有足够的时间来学习它。不过,我一定会记住这个选项!

如果您不是在寻找最优雅的方式,就像在您的原始问题中那样,而是寻找最快/最短的方式:对于 C++ 一种方式(恕我直言,最短的方式)将使用专为此设计的 C++/CLI。特别是如果你不仅有函数还有类。您创建了一个相当简单的薄包装层......在这里您可以找到一个简短的(10 分钟内)howto,其中更详细地描述了它。


推荐阅读