Я работаю над проектом (кросс-платформенный, но в данном случае имеет значение только Windows), который создает много общих библиотек (которые в некоторой степени зависят друг от друга). Все заголовочные файлы, которые объявляют функции или структуры / classes / enums / etc. находятся в отдельной папке / include, но исходные файлы сгруппированы в модули.
Я создал макрос для импорта / экспорта _declspec, но мой вопрос заключается в следующем:
Должен ли я иметь другую директиву препроцессора, которая запускает экспортную версию для каждой библиотеки? Поскольку библиотеки могут использовать заголовки, принадлежащие другим библиотекам, важно ли, чтобы эти символы рассматривались как импорт?
Из того, что я тестировал в фиктивном проекте, вы можете использовать их все как символы экспорта, и они все еще работают, но разве это хорошая практика?
Спасибо.
Вы должны создать макрос, чтобы объявить экспорт для класса / функции, которую вы хотите экспортировать из вашей библиотеки.
все заголовки include (вашей зависимости) должны быть объявлены как Import. я не слежу за вами, как экспорт все время работает для вас (это не должно).
вот пример —
на 1-й библиотеке определите в .h файле. в файле проекта определите препроцессор __your_module_name>_DLL__
Заголовочный файл библиотеки 1:
#ifdef __<your_module_name>_DLL__
#define <your_module_name>_EXPORT __declspec(dllexport)
#else
#define <your_module_name>_EXPORT __declspec(dllimport)
#endif
class <your_module_name>_EXPORT someName
{
....
}
на 2-й библиотеке, если он импортирует 1-й файл заголовка библиотеки и предполагая, __<your_module_name>_DLL__
препроцесс не определен в файле проекта, someName
класс будет imported
скорее, чем exported
,
это позволит вам правильно использовать перекрестные зависимости во время компиляции.