背景:我以Euler项目为借口来测试各种C ++功能并发现我的知识上的漏洞。我有一个创建可解决各种数学问题的可执行文件的项目。它变得笨拙,我将问题分解为单独的可执行文件。许多问题中都重复使用了许多数学函数。
首先:我想使用数学助手功能创建DLL文件。与其为整个dll提供一个单独的mathhelp.h
文件,不如让我有几个单独的.h
文件,例如primes.h
,cartesian.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
的事实而感到窒息?
答案 0 :(得分:1)
当您向用户提供c ++编译的API(假设它是在.dll
文件中编译的)时,您应该在.dll
文件旁边还提供.h
文件(包含所有标头,用于编译.dll
和.lib
文件(包含从。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
标志指定的文件夹中(他将在其中找到标头)。>