我有一个库(我们称之为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 测试框架),因为我经常更改代码(现在:)),那里有许多复杂的依赖项,我想确保在每次更改后所有测试我已编写的内容已涵盖,并且功能与预期相同。
在编写测试时,我需要访问所有类以确保每个 cog 都朝着正确的方向转动(即使它没有暴露在外部)。我该如何处理?我可以MYLIBSHARED_EXPORT
在所有类前面添加,但这也将允许普通用户查看内容,这只是为了间接使用。这可以使用可以通过项目设置设置的另一个更精确地进行调节#define
,并且只有在定义时,所有没有前缀的类都会得到一个,否则它们将不会被暴露。虽然这个解决方案很可能会成功,但它会造成代码混乱,如果可能的话,我想避免这种情况。