所以,我有一个包含 3 个项目(2 个 DLL 和 1 个 .exe)的 c++ 解决方案。
这是基本的依赖关系表示:
应用程序 --> DLL2
应用程序 --> DLL1
DLL2 --> DLL1
我遇到的问题是 DLL2(在构建它时)确实生成了 .dll 但不生成 .lib 和 .exp 我需要在应用程序项目中正确引用 DLL2。但是,DLL1 确实生成了这些文件,我已经将 DLL1 的设置与 DLL2 的设置进行了比较,但我找不到可能有什么区别。
所以,我有一个包含 3 个项目(2 个 DLL 和 1 个 .exe)的 c++ 解决方案。
这是基本的依赖关系表示:
应用程序 --> DLL2
应用程序 --> DLL1
DLL2 --> DLL1
我遇到的问题是 DLL2(在构建它时)确实生成了 .dll 但不生成 .lib 和 .exp 我需要在应用程序项目中正确引用 DLL2。但是,DLL1 确实生成了这些文件,我已经将 DLL1 的设置与 DLL2 的设置进行了比较,但我找不到可能有什么区别。
对此的简单解释是您只是忘记导出任何内容。如果没有导出,链接器将不会创建 .lib/.exp 文件。dumpbin.exe /exports
您可以通过在 DLL 上运行来验证这一点。期望你什么也看不见。
用于__declspec(dllexport)
从 DLL 中导出符号。或 .def 文件。
问题是 DLL2 只有 .h 文件,而任何关联的 .cpp 文件中都没有内容。所以 IDE 没有看到创建 .lib 文件的必要性。
我刚刚发现了另一种导致同样事情发生的方法。我将一些我在另一个 DLL 中作为服务例程开发和测试的例程移到了它们自己的 DLL 中。由于这一举措是在我编写第一行代码之前计划好的,因此它们没有被标记为导出,因此使用了该项目的默认调用约定 __cdecl。当我构建库时,构建环境没有创建 .LIB 文件。经过一番调查,并受到本主题中提到的 __declspec(dllimport) 的启发,我意识到,虽然我将声明移到了新建项目向导生成的模板头文件中,但我忘记插入生成的调用约定的名称宏到原型中。
使用指定的调用约定,在包含实现的头文件和 CPP 文件中,我得到了预期的 .LIB 文件。