C++ C++;VisualStudioDLL文件

C++ C++;VisualStudioDLL文件,c++,database,visual-studio,dll,header,C++,Database,Visual Studio,Dll,Header,我的目标是创建一个dll和lib文件,因此我将遵循 1) 我在VS中创建了一个新的win32控制台应用程序项目,选择DLL作为“应用程序类型”,并清空了项目 2)我试图在C++中创建一个数据库。因此,我有5个仅包含函数声明的标题。 3) Database.h是我的顶部标题,它如下所示: #ifdef DBDLL_EXPORTS #define DBDLL_API __declspec(dllexport) #else #define DBDLL_API __declspec(dllimport

我的目标是创建一个dll和lib文件,因此我将遵循
1) 我在VS中创建了一个新的win32控制台应用程序项目,选择DLL作为“应用程序类型”,并清空了项目
2)我试图在C++中创建一个数据库。因此,我有5个仅包含函数声明的标题。
3) Database.h是我的顶部标题,它如下所示:

#ifdef DBDLL_EXPORTS
#define DBDLL_API __declspec(dllexport) 
#else
#define DBDLL_API __declspec(dllimport) 
#endif
#ifndef __Database_H
#define __Database_H


#include "Table.h"

class DBDLL_API Database { ... };
#endif

4) 现在,我只使用标题,尝试编译该项目。它已编译,但我在项目文件夹的任何地方都没有看到任何DLL或LIB。如何创建它们?

这是因为没有编译头文件——只编译CPP文件(它拉入头文件——一个源文件,它拉入的所有头文件称为“翻译单元”,这是实际编译的东西(独立于其他TU))

因此,实际上,构建系统认为您正在构建一个空项目,在这种情况下,根本不会生成任何内容。请注意,即使头被拉入并编译,除非导出的符号实际上在某处被引用,否则它可能会被优化。在这种情况下,您将得到一个(空的)DLL,但没有
.lib
文件(如果您的依赖项目在DLL中没有任何内容之前查找此
.lib
,则可能会导致错误)

您需要创建一些CPP文件,这些文件实现头文件中声明的函数。如果您在标题中拥有所有内容,并且根本不需要任何CPP文件,那么拥有DLL就没有意义了!(因为您可以在任何其他项目中包含标题,而不需要任何其他依赖项。)

最后,include-guard(
#ifndef…
)应该包含整个头,包括DLL导出宏,否则最终会收到宏重新定义警告


我建议使用一次
#pragma
而不是include-guard,因为它更简单,而且几乎每个编译器都能识别。我还将把DLL宏goop放入它自己的头文件(例如“dllmacros.h”),并在需要的地方包含它(这将减少重复)。

这是因为头文件没有被编译——只有CPP文件被编译(它会拉入头文件——一个源文件,它拉入的所有头文件称为“翻译单元”,这是实际正在编译的对象(独立于其他tu))

因此,实际上,构建系统认为您正在构建一个空项目,在这种情况下,根本不会生成任何内容。请注意,即使头被拉入并编译,除非导出的符号实际上在某处被引用,否则它可能会被优化。在这种情况下,您将得到一个(空的)DLL,但没有
.lib
文件(如果您的依赖项目在DLL中没有任何内容之前查找此
.lib
,则可能会导致错误)

您需要创建一些CPP文件,这些文件实现头文件中声明的函数。如果您在标题中拥有所有内容,并且根本不需要任何CPP文件,那么拥有DLL就没有意义了!(因为您可以在任何其他项目中包含标题,而不需要任何其他依赖项。)

最后,include-guard(
#ifndef…
)应该包含整个头,包括DLL导出宏,否则最终会收到宏重新定义警告


我建议使用一次
#pragma
而不是include-guard,因为它更简单,而且几乎每个编译器都能识别。我还将把DLL宏goop放入它自己的头(例如“dllmacros.h”),并在需要的地方包含它(这将减少重复)。

顺便说一句,查找生成文件的默认路径是
Debug\x86
。顺便说一句,查找生成文件的默认路径是
Debug\x86