DLL项目没有生成.exp和.lib文件。

8
所以,我有一个包含3个项目(2个DLL和1个.exe)的C++解决方案。
以下是基本依赖关系表示:
应用程序--> DLL2
应用程序--> DLL1
DLL2--> DLL1
我的问题是,在构建DLL2时,它会生成.dll文件,但不会生成我需要引用DLL2的Application项目中正确的.lib和.exp文件。然而,DLL1确实会生成这些文件,我已经比较了DLL1和DLL2的设置,但找不到差异在哪里。
3个回答

14

简单的解释是您忘记了导出任何内容。 如果没有导出,链接器将不会创建.lib/.exp文件。您可以通过在DLL上运行dumpbin.exe /exports来验证这一点。预期您将看到空白。

使用__declspec(dllexport)从DLL中导出符号。或者使用.def文件。


1
并记得包含定义常规导出宏的头文件。 :) - Luchian Grigore
是的...不幸的是,仅使用"extern"标记并不足以将某些内容标记为dll导入。 - Ross Youngblood

6
问题在于DLL2只有.h文件,没有任何相关的.cpp文件内容。因此,IDE没有意识到需要创建.lib文件。

3
谢谢,这个答案对我很有帮助。另外,我需要添加至少一个static __declspec(dllexport)方法才能使lib文件出现。 - Oleg Vazhnev
与Unix/Linux不同,Windows中创建共享库是一个非常麻烦的事情。仅使用"extern"标记并不足以强制编译器/链接器将函数标记为包含在DLL中。我相信微软实现这种方式肯定有一些逻辑上的原因。我怀疑它需要数百甚至数千人来解释为什么需要填写"__declspec(dllimport)/__declspec (dllexport)"标记。或者可以雇用人员检查开发人员的代码,确保*.def文件与最新代码同步。 - Ross Youngblood

1
我刚刚发现了另一种导致相同问题的方法。我将之前作为服务程序在另一个DLL中开发和测试的一些例程移动到了它们自己的DLL中。由于这个移动是在我编写第一行代码之前计划好的,它们没有被标记为导出,并且因此使用了该项目的默认调用约定__cdecl。当我构建库时,构建环境没有创建.LIB文件。经过一些调查,并受到此主题中__declspec(dllimport)的提及启发,我意识到,尽管我将声明移入了New Project Wizard生成的模板头文件中,但我忘记将生成的调用约定宏的名称插入到原型中。

在指定了调用约定后,在包含实现的头文件和CPP文件中,我得到了预期的.LIB文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接