【问题标题】:C++ DLL Header includesC++ DLL 头包括
【发布时间】:2017-08-11 08:37:13
【问题描述】:

我正在 Visual Studio 中创建一个 DLL。

我有 3 个自己的头文件,它们包含在 DLL 的头文件中。 在 DLL 中编译后,我想丢弃 3 个头文件。

我尝试了很多方法来实现这一点,但效果不佳。当我从项目中删除 3 个头文件时,我收到头文件丢失的错误。 DLL 被编译和创建。

DLL.h:

#ifndef DLL_H
#define DLL_H

#include "header1.h"
#include "header2.h"
#include "header3.h"

#endif

我在 main.cpp 中包含了 DLL.h 以使用包含的 DLL 和头文件。

我也创建了一个 DLL.cpp,但是这个文件是空的。

如何在 Visual Studio 中设置文件或设置,使头文件可以从 DLL 中识别,但头文件不存在?

【问题讨论】:

  • 头文件未“包含在 DLL 中”。它们完全用于不同的目的。头文件被编译器使用; DLL 由链接器和运行时使用。
  • 你所说的“扔掉”是什么意思,你为什么要这样做?头文件是大多数 C++ 项目源代码的一部分。头文件只能被预处理器看到。您可以在 CPP 文件的属性中选择生成预处理文件并检查实际传递给编译器的生成的 .i 文件。编译器不知道如何处理#include。

标签: c++ visual-studio dll header-files


【解决方案1】:

如果这些头文件与 DLL 导出的 API 无关,则不应将它们包含在 DLL 头文件中。 如果你真的想这样做,你可以用预处理器隐藏它们。

#ifndef DLL_H
#define DLL_H

// You can set BUILDING_DLL=1 in only DLL project, 
// I assume that you already have such variable to determine 
// whenever to use  __declspec(dllexport) or  __declspec(dllimport)
#if BUILDING_DLL
#include "header1.h"
#include "header2.h"
#include "header3.h"
#endif

#endif

但我鼓励您验证是否需要。它会在没有这些头文件的情况下编译吗?如果可以,您可以简单地删除它们并仅包含在 cpp 文件中。如果不是,则无法删除它们,因为一旦您想要链接到 DLL,编译器就必须知道来自此标头的 API 和 ABI。例如。如果声明了某种用作函数参数的类型,编译器必须知道这种类型。

【讨论】:

  • 好的,我会更好地解释我的问题。这 3 个头文件包含 main 需要使用的变量。在第一个实例中,我在 main 中包含头文件,因此我可以使用变量。现在我想创建一个 DLL,这样它只需要编译一次,当其他用户想要使用此信息时,我可以向他们发送 DLL 而不是 3 个单独的头文件。或者 DLL 不是最好的方法?
  • 嗯,这是完全不同的问题。那是变量还是常量?我想念这里的大图。如果 DLL 应该替换标头,它听起来像常量,但它们是运行时配置,对吗? DLL 没问题,但我建议用函数、getter 和 setter 包装这些变量。如果您需要变量,尽管您必须在 main 和 dll 中都包含头文件,但在 DLL 和导出中只定义一次它们。每当您更改值时,您只需构建新的 DLL 并发送它。 (stackoverflow.com/questions/3097548/…)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 2017-01-16
  • 2018-09-12
  • 1970-01-01
  • 2012-02-12
  • 2020-03-11
相关资源
最近更新 更多