c++ - 从第 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++ 一种方式(恕我直言,最优雅的方式)是使用为此设计的 C++/CLI。特别是如果你不仅有函数还有类。
您创建了一个相当简单的薄包装层:
- 创建一个 CLI 类
- 放一个原始类的成员实例
- 包装原始类中的所有公共方法
像这样(未经测试):
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,其中更详细地描述了它。
推荐阅读
- html - 如何在双引号中显示标签?
- xcode - 从哪里获得 7.2 Xcode 的开发人员映像
- python - 想要从给定站点抓取所有成员的个人资料链接
- entity-framework - 将更改保存到映射到视图的实体
- jquery - 如何根据第一个日期选择器更改第二个日期选择器日期?
- python - 如何在使用 python 3.4 的方法中将 `ObjectName` 的名称(如`self.lineEdit_260`)作为参数传递?
- javascript - 如何使用jQuery的hasClass函数检查表是否有类?
- user-interface - Xamarin Forms Frame 不随内容扩展
- android - 应用程序未在通知访问设置 Android 中列出
- ios - 未使用 AVAssetWrite 录制音频