加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C包装器DLL到静态LIB

发布时间:2020-12-16 09:36:56 所属栏目:百科 来源:网络整理
导读:我有一些静态编译的库(.lib),我在我的项目中使用它,它是用C语言编写的,并在 Windows和 Linux上构建.在我项目的这些库的入口点,我只使用静态库套件中“main”库中的一个或两个函数(但我确信这些函数会调用套件中其他库中的许多其他函数) . 理想情况下,我希望
我有一些静态编译的库(.lib),我在我的项目中使用它,它是用C语言编写的,并在 Windows和 Linux上构建.在我项目的这些库的入口点,我只使用静态库套件中“main”库中的一个或两个函数(但我确信这些函数会调用套件中其他库中的许多其他函数) .

理想情况下,我希望有一套动态链接库(DLL)包装在静态库套件中的每个库中;我已经读过/听说过在Windows上执行此操作的方法(例如,Visual Studio 2005/2008/2010)是“创建一个包装器DLL”,其中一些公开的函数调用底层的静态库函数.如果有人可以在MS Visual Studio 2005/2008/2010中详细介绍如何进行一些片段,我将非常感谢.我相信你们中的一些人可能已经在日常工作中这样做了;非常感谢您的体验.

编辑:

为了像我这样的其他人的利益,我发布了我发现的第一个“有用”链接:
http://tom-shelton.net/index.php/2008/12/11/creating-a-managed-wrapper-for-a-lib-file/

解决方法

“将库转换为另一种库类型”似乎很容易,但事实并非如此.没有直接的逐步方法来执行此操作,因为C和DLL根本无法很好地协同工作,并且您的代码需要进行调整以支持DLL接口.

描述问题的简明方法是:

> .lib的界面是C
> .dll的界面是C.

因此,DLL的界面根本不支持C,你需要聪明才能使它工作 – 这就是为什么模糊的现有答案.

一种标准方法是通过COM,这意味着为库构建一个完整的COM包装器,包括类工厂,接口,对象,并使用BSTR而不是std :: string.我猜是不实际的.

另一个解决方案是为您的C库创建一个DLL安全的C接口.这意味着基本上创建一个winapi风格的界面,这可能是不切实际或根本没有使用你的库的目的.这就是@David Heffernan建议的.但他没有解决的问题是如何将代码更改为与DLL兼容.

一个重要但微妙的问题是您无法跨DLL边界传递任何模板化C对象.这意味着将std :: string传入或传出DLL函数被认为是不安全的.每个二进制文件都有自己的std :: string代码副本,并且不能保证它们会恰好相互配合.每个二进制文件(可能)也获得它自己的CRT副本,你将通过操纵另一个模块的对象来搞乱一个模块的内部状态.

编辑:您可以使用__declspec(dllexport)在MSVC中导出C对象,并使用__declspec(dllimport)导入它们.但是这个和细微之处有很多限制会导致问题.基本上这是让编译器为导出的类或函数创建廉价C风格接口的快捷方式.问题是它没有警告你发生了多少不安全的事情.重申:

>如果有任何模板化符号越过DLL边界,则它不安全(例如std :: *).>具有CRT管理状态的任何对象都不应跨越DLL边界(例如,FILE *).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读