【问题标题】:Can you create multiple header files for a DLL? Can you consolidate header files?你可以为一个 DLL 创建多个头文件吗?可以合并头文件吗?
【发布时间】:2019-04-27 11:16:27
【问题描述】:

背景:我以 Project Euler 为借口来测试各种 C++ 功能并在我的知识中找到漏洞。我有一个项目可以创建一个解决各种数学问题的可执行文件。它变得笨拙,我将问题分成单独的可执行文件。许多数学函数在几个问题中被重用。

首先:我想创建一个带有数学辅助函数的 DLL 文件。我宁愿为整个 dll 提供一个单独的 mathhelp.h 文件,而不是提供几个单独的 .h 文件,例如primes.hcartesian.h 等/,每个都提供对 dll 中单独命名空间的访问。

这可能吗?

第二:另外,我确实想要一个 mathhelp.h 文件用于那些足够大的项目,他们只需要访问每个帮助函数而不包括五十个单独的标题。如何做到这一点在:

How to export multiple header files as a single header file in C++?

但这个答案给了我一个后续问题:如果在一个可执行项目中,我包含来自 DLL 项目的以下标头:

#ifndef MATHHELP_H
#define MATHHELP_H
#include "primes.h"
#include "cartesian.h"
#endif

...如果我在可执行项目中也没有primes.h,它如何编译?预编译器不会到达第一个 #include 并窒息我在项目中没有 primes.h 的事实吗?

【问题讨论】:

  • 我创建了dlls 有一百多个头文件。因为每个类使用 1 个标头的概念。
  • 但是它们是暴露给 DLL 的用户的,还是内部的?
  • 是的,它们暴露在 dll 中。
  • @Marga 的回答与我所做的非常接近。也类似于vtkitkQt等大型开源软件
  • 你必须告诉编译器 mathhelp.h 的位置。例如,通过设置 INCLUDE 环境变量,或您最喜欢的 IDE 使用的任何机制。只要将所有其他 .h 文件保存在同一目录中,就不必做任何特别的事情。

标签: c++ dll header-files


【解决方案1】:

当您向用户提供 c++ 编译的 API(假设它在 .dll 文件中编译)时,您应该在 .dll 文件旁边提供 .h 文件(包含用于编译的所有头文件.dll) 和 .libfiles (包含从 .dll 导出的符号)。 现在假设您的用户拥有可执行文件a.exe,并且想要使用您编译的API。通常你会为他们提供一个看起来或多或少类似的文件结构:

include / primes.h
          cartesian.h
          mathhelp.h

lib     / Api.lib

bin     / Api.dll

当外部可执行文件使用您的代码时,他需要在编译过程中添加外部标志,例如:-I/pathToInclude -L/PathToLib -l/yourLibrary(您需要检查确切的 sintax 以执行此操作)。 在您的代码中,您将拥有如下内容:

#ifndef MATHHELP_H
#define MATHHELP_H
#include <primes.h>
#include <cartesian.h>
#endif

在这种情况下,编译器将首先查看当前目录(他不会在其中找到标头),然后在 -I 标志指定的文件夹中(他将在其中找到您的标头)。

【讨论】:

  • “包含用于编译的所有头文件” - 我的印象(来自链接的问题)这是不必要的,您可以做一些事情来只提供一个头文件DLL。我误会了吗?
  • 您将需要所有标题(如我上面所写),或者如果您确切知道正在使用的 .dll 的导出函数是什么,则可以使用 LoadLibrary("yourdll" ) 和 GetProcAddress("yourMethod") 并通过函数指针执行函数,在这种情况下不需要标题。
  • 在某些情况下,您可以这样做(将标题合并为一个标题),但可能很难做到。对于大型图书馆,无论如何它并不能真正帮助用户。
猜你喜欢
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 2011-07-02
  • 2014-03-17
相关资源
最近更新 更多