背景:我使用Project 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
而窒息?
当你向用户提供c ++编译的API时(假设它是在.dll
文件中编译的)你应该在.dll
文件旁边提供.h
文件(包含用于编译.dll
的所有头文件)和.lib
files(包含导出的文件)来自.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
标志指定的文件夹中(他将找到您的标题)。