如何在给定每个静态库定义导出功能的情况下将多个静态链接库合并到单个dll中(vc++ 2008)?
在存在于单个dll项目和静态链接的多个子项目(在dll项目中)的多项目布局中。尽管被标记为__declspec(导出),但子项目(.lib)中的一些符号拒绝将其符号导出到最终的dll中。
生成.def文件并显式标记要导出的符号可以解决此问题。然而,识别哪些符号被标记为__declspec(导出)证明了一个问题。由于导出了大量的类/函数,并且主要是名称损坏,因此手动维护列表是一个不可接受的过程,因此生成标记为要导出的符号列表将是唯一可行的选择。
有没有实用程序或编译器指令可以做到这一点?
发布于 2012-03-14 20:43:21
使用DEF文件。
始终使用DEF文件。
一定要使用DEF文件。
只需接受DEF文件是可以使用的东西。
停止使用__declspec(dllexport),并且已经使用了一个dang-dratted的def文件。
另外,不要导出类。导出那些只需要导出的类成员。并使用DEF文件来完成此操作。
严格地说,如果导出没有DEF文件的类,函数名将比实际程序数据长几倍。导出C++成员函数时应使用序号。
发布于 2012-03-15 17:45:11
经过反复试验,我发现可以使用lib /def命令来生成导入库和导出文件。导出文件似乎包含所有标记为__declspec(dllexport)的符号。随后,可以使用dumpbin检查.exp文件,并将其用作生成模块定义文件的引用。
发布于 2018-12-23 11:40:28
从Visual Studio2015Update2开始,有了一种新的方法来实现这一点,即使用链接器选项/WHOLEARCHIVE
它是文档化的here
/WHOLEARCHIVE
选项强制链接器包含指定静态库中的每个对象文件,如果未指定库,则包含为LINK命令指定的所有静态库中的每个对象文件。若要为多个库指定/WHOLEARCHIVE
选项,可以在链接器命令行上使用多个/WHOLEARCHIVE
开关。默认情况下,仅当链接器导出由可执行文件中的其他目标文件引用的符号时,链接器才会在链接输出中包括目标文件。/WHOLEARCHIVE
选项使链接器将静态库中存档的所有目标文件视为在链接器命令行上单独指定的文件。
https://stackoverflow.com/questions/9702017
复制相似问题