C++ Visual Studio DLL 文件

标签 c++ database visual-studio dll header

我的目标是创建一个 dll 和 lib 文件,所以我关注 this guide
1) 我在 VS 中创建了一个新的 win32 控制台应用程序项目,选择 DLL 作为“应用程序类型”和清空项目
2) 我正在尝试用 C++ 创建一个数据库。所以我有 5 个只有函数声明的 header 。
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))。

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

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

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

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

关于C++ Visual Studio DLL 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14803789/

相关文章:

visual-studio - 如何使用 tasks.json 构建和编译 typescript

c++ - 如何将 boost 路径类型转换为字符串?

mysql - 数据建模/标准化问题

c++ - 从其他文件调用 C++ 主类

asp.net - 更改数据库密码和避免网站停机的流程

mysql - phpmyadmin 添加文本到字段

c++ - visual studio 2010 在调试期间显示 const int 0

c# - 如何使用 C# 在 Excel 中选择现有图表

c++ - clang osx march=native 没有优化的大约 1/3rd 速度

c++ - 编译器如何有效地优化 getline()?