C++ 如果每个静态库定义导出的功能(vc+;+;2008),如何将多个静态链接库合并到单个dll中?

C++ 如果每个静态库定义导出的功能(vc+;+;2008),如何将多个静态链接库合并到单个dll中?,c++,dll,visual-c++,function,C++,Dll,Visual C++,Function,如果每个静态库定义导出的功能(vc++2008),如何将多个静态链接库合并到单个dll中 在静态链接的单个dll项目和多个子项目(在dll项目中)之外存在的多项目布局中。尽管标记为_declspec(export),子项目(.lib)中的一些符号仍拒绝在最终dll中导出它们的符号 生成.def文件并显式标记要导出的符号可以解决此问题。然而,识别哪些符号标记为_declspec(导出)证明了一个问题。由于大量导出的类/函数,主要是名称损坏,手工维护列表是一个不可修改的过程,因此生成标记为导出的符号

如果每个静态库定义导出的功能(vc++2008),如何将多个静态链接库合并到单个dll中

在静态链接的单个dll项目和多个子项目(在dll项目中)之外存在的多项目布局中。尽管标记为_declspec(export),子项目(.lib)中的一些符号仍拒绝在最终dll中导出它们的符号

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

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

使用DEF文件

始终使用DEF文件

决不能不使用DEF文件

只要接受DEF文件就是要使用的东西

停止使用u declspec(dllexport),并且已经使用了一个dang DRATED def文件

也不要导出类。导出仅需要导出的类成员。并使用DEF文件执行此操作


说真的,如果导出类时没有DEF文件,函数名将比实际程序数据长几倍。您应该使用序列化来导出C++成员函数。

在比特试验和错误之后,我发现使用LIB/DEF命令可以生成导入库和导出文件。导出文件似乎包含用_declspec(dllexport)标记的所有符号。随后,可以使用dumpbin检查.exp文件,并将其用作生成模块定义文件的参考。

从Visual Studio 2015 Update 2开始,有一种新的方法可以做到这一点,即使用链接器选项
/wholerchive

记录在案

/wholerchive
选项强制链接器包含每个对象 来自指定静态库的文件,或者如果没有库 从指定给LINK命令的所有静态库中指定。到 为多个库指定
/wholerchive
选项,您可以使用 链接器命令行上有多个
/wholerchive
开关。通过 默认情况下,链接器仅在以下情况下在链接输出中包含对象文件: 它们导出由中的其他对象文件引用的符号 可执行文件。
/wholerchive
选项使链接器处理所有对象 在静态库中存档的文件,就好像它们是指定的一样 在链接器命令行上单独显示


但是,您仍然需要提供一个损坏的名称,即内部名称。函数签名可能会在开发周期中发生变化,托管名称也会发生变化。您打算如何管理那些没有外部“c”的测试工具?@phr34k,您将拥有一个测试工具,其中包含类和函数定义以及指向DLL导出库的链接。每次引用函数时,都会出现一个链接器错误,该错误给出了损坏的名称。(如果没有对函数进行测试,只需获取它的地址
void*p=(void*)和ClassName::FunctionName
)。使用序号和NONAME属性将该损坏的名称添加到DEF文件中。(您必须删除
\u imp
前缀)。通过这种方式,您将保证已导出测试线束引用的每个功能,从而测试DEF文件。此答案缺少一些文档和示例:-(