У меня есть библиотека (назовем ее MyLib
), которая имеет следующую структуру:
mylib_global.h — определяет, стоит ли
Q_DECL_IMPORT
илиQ_DECL_EXPORT
за префиксомMYLIBSHARED_EXPORT
, который используется для отображения определенных символов библиотеки при написании приложения, использующего библиотеку:#ifndef MYLIB_GLOBAL_H #define MYLIB_GLOBAL_H #include <QtCore/qglobal.h> #if defined(MYLIB_LIBRARY) // Set using DEFINES inside MyLib.pro # define MYLIBSHARED_EXPORT Q_DECL_EXPORT #else # define MYLIBSHARED_EXPORT Q_DECL_IMPORT #endif #endif // MYLIB_GLOBAL_H
MyLib.h — содержит основной класс, который также включает в себя различные другие классы:
#include "mylib_global.h" #include "MyLibOtherClass1.h" #include "MyLibOtherClass2.h" // Symbol will be exposed to the application that links against MyLib // and can be directly interacted with from the application's code class MYLIBSHARED_EXPORT MyLibMainClass { public: ... private: MyLibOtherClassA ocA; MyLibOtherClass1 oc1; MyLibOtherClass2 oc2; ... } // Symbol will not be exposed to the application that links against MyLib // however it is indirectly used through the `MyLibMainClass` class MyLibOtherClassA { ... }
Исходные файлы и другие классы (заголовок+источник) — содержат объявления и определения базовой логики
MyLib
.
Как видите, у меня смешанные классы: некоторые из них определены в том же заголовочном файле, что и основной класс библиотеки (он управляет всеми остальными экземплярами классов), другие — в других заголовочных файлах. Есть очень мало классов с MYLIBSHARED_EXPORT
, которые мне нужно выставить, чтобы иметь доступ к функциям библиотеки при компоновке с ней.
Это совершенно нормально при написании обычного приложения. Однако я решил написать несколько тестов (используя тестовую среду Qt), так как я довольно часто изменяю код (пока :)), там много сложных зависимостей, и я хочу убедиться, что после каждого изменения все тесты написали покрыты, и функциональность остается такой же, как предполагалось.
При написании тестов мне нужно получить доступ ко ВСЕМ классам, чтобы убедиться, что каждая шестеренка вращается в правильном направлении (даже если она не выставлена наружу). Как мне справиться с этим? Я могу добавить MYLIBSHARED_EXPORT
перед всеми классами, но это также позволит обычным пользователям видеть вещи, которые предназначены только для косвенного использования. Это можно регулировать более точно, используя другой #define
, который можно установить в настройках проекта, и только когда он определен, все классы, у которых нет префикса, получат его, иначе они не будут выставлены. Хотя это решение, скорее всего, поможет, оно создаст беспорядок в коде, которого я хотел бы избежать, если это возможно.