从第 3 方库导出 cpp 损坏的函数
Exporting cpp mangled functions from a 3rd party library
我有第三方库作为源代码。它带有一个 Visual Studio 项目,可以从中构建一个 .lib。
虽然我想从 C# 访问功能,所以我复制了项目并将其更改为创建一个 dll。
虽然 DLL 不包含任何导出函数,因此我还创建了一个模块定义 (.def) 文件,并在导出部分添加了我需要的函数。
这适用于在 extern "C"
块中声明的所有函数。但是,我需要的一些功能是在这些块之外声明的。
如果我将这些添加到出口部分,我会收到错误 LNK2001 unresolved external symbol XYZ
:(
如果可以避免,我不想更改 3rd 方库的源代码。
访问这些功能的最优雅、最简单的方法是什么?
编辑
还有一点需要澄清:据我所知,我想公开的接口中没有涉及 C++ 功能。老实说,我不明白为什么第 3 方作者不只是将剩余的几个函数包含到 extern "C"
块中。这些函数在头文件的底部,也许添加它们的人犯了一个错误,将它们放在 extern "C"
块范围之外。
对于 C++,一种方式(恕我直言,最优雅)是使用专为此设计的 C++/CLI。特别是如果你不仅有功能,还有 classes.
您创建了一个相当简单的薄包装层:
- 创建 CLI class
- 放一个原来的成员实例class
- 包装原始 class
中的所有 public 方法
像这样(未经测试):
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;
};
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;
};
Here 你可以找到一个简短的 howto,里面有更详细的描述。
编辑:
来自您的评论:
[...] I never worked with C++/CLI though and the language looks a little confusing. Since the project deadline is pretty close I'm not sure if there's enough time to learn it. I'll definitely keep this option in mind though!
如果你不是寻找最优雅的方式,就像你原来的问题一样,而是fastest/shortest方式:对于C++一种方式(恕我直言,最短方式)将使用为此设计的 C++/CLI。特别是如果你不仅有功能,还有 classes。您创建了一个相当简单的薄包装层... Here 您可以找到一个简短的(10 分钟内)howto,其中对其进行了更详细的描述。
我有第三方库作为源代码。它带有一个 Visual Studio 项目,可以从中构建一个 .lib。
虽然我想从 C# 访问功能,所以我复制了项目并将其更改为创建一个 dll。
虽然 DLL 不包含任何导出函数,因此我还创建了一个模块定义 (.def) 文件,并在导出部分添加了我需要的函数。
这适用于在 extern "C"
块中声明的所有函数。但是,我需要的一些功能是在这些块之外声明的。
如果我将这些添加到出口部分,我会收到错误 LNK2001 unresolved external symbol XYZ
:(
如果可以避免,我不想更改 3rd 方库的源代码。
访问这些功能的最优雅、最简单的方法是什么?
编辑
还有一点需要澄清:据我所知,我想公开的接口中没有涉及 C++ 功能。老实说,我不明白为什么第 3 方作者不只是将剩余的几个函数包含到 extern "C"
块中。这些函数在头文件的底部,也许添加它们的人犯了一个错误,将它们放在 extern "C"
块范围之外。
对于 C++,一种方式(恕我直言,最优雅)是使用专为此设计的 C++/CLI。特别是如果你不仅有功能,还有 classes.
您创建了一个相当简单的薄包装层:
- 创建 CLI class
- 放一个原来的成员实例class
- 包装原始 class 中的所有 public 方法
像这样(未经测试):
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;
};
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;
};
Here 你可以找到一个简短的 howto,里面有更详细的描述。
编辑:
来自您的评论:
[...] I never worked with C++/CLI though and the language looks a little confusing. Since the project deadline is pretty close I'm not sure if there's enough time to learn it. I'll definitely keep this option in mind though!
如果你不是寻找最优雅的方式,就像你原来的问题一样,而是fastest/shortest方式:对于C++一种方式(恕我直言,最短方式)将使用为此设计的 C++/CLI。特别是如果你不仅有功能,还有 classes。您创建了一个相当简单的薄包装层... Here 您可以找到一个简短的(10 分钟内)howto,其中对其进行了更详细的描述。