从第三方库导出 cpp 损坏的函数

Exporting cpp mangled functions from a 3rd party library

本文关键字:损坏 函数 cpp 第三方      更新时间:2023-10-16

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

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

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

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

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

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

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

编辑

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

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

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

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

像这样(未经测试):

C++ nativ:

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

命令行包装器:

// 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 分钟)操作方法,其中更详细地描述了它。