首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在给定每个定义导出功能的静态库的情况下,将多个静态链接库合并到单个dll中(vc++ 2008)?

如何在给定每个定义导出功能的静态库的情况下,将多个静态链接库合并到单个dll中(vc++ 2008)?
EN

Stack Overflow用户
提问于 2012-03-14 20:29:50
回答 3查看 2.6K关注 0票数 2

如何在给定每个静态库定义导出功能的情况下将多个静态链接库合并到单个dll中(vc++ 2008)?

在存在于单个dll项目和静态链接的多个子项目(在dll项目中)的多项目布局中。尽管被标记为__declspec(导出),但子项目(.lib)中的一些符号拒绝将其符号导出到最终的dll中。

生成.def文件并显式标记要导出的符号可以解决此问题。然而,识别哪些符号被标记为__declspec(导出)证明了一个问题。由于导出了大量的类/函数,并且主要是名称损坏,因此手动维护列表是一个不可接受的过程,因此生成标记为要导出的符号列表将是唯一可行的选择。

有没有实用程序或编译器指令可以做到这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-14 20:43:21

使用DEF文件。

始终使用DEF文件。

一定要使用DEF文件。

只需接受DEF文件是可以使用的东西。

停止使用__declspec(dllexport),并且已经使用了一个dang-dratted的def文件。

另外,不要导出类。导出那些只需要导出的类成员。并使用DEF文件来完成此操作。

严格地说,如果导出没有DEF文件的类,函数名将比实际程序数据长几倍。导出C++成员函数时应使用序号。

票数 3
EN

Stack Overflow用户

发布于 2012-03-15 17:45:11

经过反复试验,我发现可以使用lib /def命令来生成导入库和导出文件。导出文件似乎包含所有标记为__declspec(dllexport)的符号。随后,可以使用dumpbin检查.exp文件,并将其用作生成模块定义文件的引用。

票数 2
EN

Stack Overflow用户

发布于 2018-12-23 11:40:28

从Visual Studio2015Update2开始,有了一种新的方法来实现这一点,即使用链接器选项/WHOLEARCHIVE

它是文档化的here

/WHOLEARCHIVE选项强制链接器包含指定静态库中的每个对象文件,如果未指定库,则包含为LINK命令指定的所有静态库中的每个对象文件。若要为多个库指定/WHOLEARCHIVE选项,可以在链接器命令行上使用多个/WHOLEARCHIVE开关。默认情况下,仅当链接器导出由可执行文件中的其他目标文件引用的符号时,链接器才会在链接输出中包括目标文件。/WHOLEARCHIVE选项使链接器将静态库中存档的所有目标文件视为在链接器命令行上单独指定的文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9702017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档