从第三方库导出 cpp 损坏的函数
Exporting cpp mangled functions from a 3rd party library
我有一个第三方库作为源代码。它附带了一个Visual Studio项目,可以从中构建一个.lib。
我想从 C# 访问该功能,所以我复制了项目并将其更改为创建 dll。
DLL 不包含任何导出的函数,因此我还创建了一个模块定义 (.def) 文件,并在 EXPORTS 部分添加了我需要的函数。
这适用于在extern "C"
块中声明的所有函数。但是,我需要的一些函数是在这些块之外声明的。
如果我将它们添加到"导出"部分,则会出现错误LNK2001 unresolved external symbol XYZ
:(
如果可以避免,我不想更改第三方库的源代码。
访问这些功能的最优雅和最简单的方法是什么?
编辑
还有一点需要澄清:据我所知,我想公开的界面中不涉及C++功能。老实说,我不明白为什么第三方作者不将剩余的几个函数包含在extern "C"
块中。这些函数位于头文件的底部,也许添加它们的人只是犯了一个错误,并将它们放在extern "C"
块范围之外。
>对于C++来说,一种方法(恕我直言是最优雅的)是使用为此而设计的 C++/CLI。特别是如果你不仅有函数,还有类。
你创建一个相当简单的薄包装层:
- 创建 CLI 类
- 放置原始类的成员实例
- 包装原始类中的所有公共方法
像这样(未经测试):
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 分钟)操作方法,其中更详细地描述了它。
- 动态构造函数中的新字符 [] 抛出"损坏的顶部大小";
- 调用std::函数成员时内存损坏
- 我的 c 字符串复制函数正在损坏其他变量的堆栈
- 构造函数初始化和对象损坏
- 动态分配时类构造函数中的堆损坏
- 从第三方库导出 cpp 损坏的函数
- 在使用新操作员和C 中的结构的调用构造函数时,获得内存损坏(Malloc)
- Win32 C API:替代损坏的execl*()系列函数?
- 对于我的类函数,我得到双重释放或损坏错误
- 堆损坏 c++ 返回表指针的函数
- 析构函数会导致堆损坏
- 为什么链表中的数据在嵌套函数中会更改/损坏?
- 有没有一种方法可以使用RTTI获得基于签名的typeinfo损坏的函数名
- 在向量中使用不带复制且没有 noexcept 移动构造函数的对象.实际损坏的内容以及我如何确认它
- 函数的返回类型是损坏名称的一部分吗?
- 当使用实例会员方法作为函数指针时,堆积损坏
- 从 dll 中的函数返回时堆损坏
- 在递归函数中释放内存时堆损坏
- 更新函数在 Azure 移动库中C++损坏
- eclipse g++没有损坏函数名