Можете ли вы создать несколько файлов заголовков для DLL?Можете ли вы объединить заголовочные файлы? - PullRequest
0 голосов
/ 27 апреля 2019

Справочная информация: я использую Project Euler в качестве предлога для тестирования различных функций C ++ и нахождения пробелов в моих знаниях.У меня есть проект, который создает исполняемый файл, который решает различные математические задачи.Это становится громоздким, и я разделяю проблемы на отдельные исполняемые файлы.Многие математические функции повторно используются в нескольких задачах.

Первый: Я хочу создать файл DLL с вспомогательными функциями математики.Вместо того, чтобы предоставлять один файл mathhelp.h для всей библиотеки DLL, я бы предпочел иметь несколько отдельных файлов .h, например primes.h, cartesian.h и т. Д., Каждый из которых обеспечивает доступ к отдельным пространствам имен в библиотеке DLL.

Возможно ли это?

Секунда: Отдельно я делаю хочу один mathhelp.h файл для этих проектов, достаточно больших, им просто нужен доступ ко всемвспомогательная функция без включения пятидесяти отдельных заголовков.Как это сделать, ответили:

Как экспортировать несколько файлов заголовков в виде одного файла заголовков в C ++?

, но этот ответ дает мне дополнительный вопрос: Если в исполняемый проект я включаю следующий заголовок из проекта DLL:

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

... как это скомпилируется, если у меня также нет primes.h в исполняемом проекте?Разве прекомпилятор не дойдет до первого #include и не захлебнется тем фактом, что у меня нет primes.h в проекте?

1 Ответ

1 голос
/ 27 апреля 2019

Когда вы предоставляете пользователю скомпилированный API c ++ (скажем, он скомпилирован в файле .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 (вынеобходимо проверить точный синтаксис для этого).В вашем коде у вас будет что-то вроде этого:

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

В этом случае компилятор будет искать сначала в текущем каталоге (где он не найдет заголовки), а затем в папках, указанных в-I флаг (где он найдет ваши заголовки).

...