【发布时间】:2016-11-03 10:47:27
【问题描述】:
我有一个库(我们称之为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 { ... } 源文件和其他类(header+source) - 包含
MyLib底层逻辑的声明和定义。
如您所见,我混合了多个类 - 有些定义在与库的主类相同的头文件中(它控制所有其他类实例),其他则位于不同的头文件中。只有极少数带有MYLIBSHARED_EXPORT 的类我需要公开,以便在链接时能够访问库的功能。
这在编写普通应用程序时非常好。但是我决定编写一些测试(使用 Qt 测试框架),因为我经常更改代码(现在:)),那里有许多复杂的依赖项,我想确保在每次更改后所有测试我已编写的内容已涵盖,并且功能与预期相同。
在编写测试时,我需要访问所有类以确保每个 cog 都朝着正确的方向转动(即使它没有暴露在外部)。我该如何处理?我可以在所有类前面添加MYLIBSHARED_EXPORT,但这也将允许普通用户查看内容,这只是为了间接使用。这可以使用另一个#define 更精确地进行调节,该#define 可以通过项目的设置进行设置,并且只有在定义时所有没有前缀的类都会得到一个,否则它们将不会被暴露。虽然这个解决方案很可能会成功,但它会造成代码混乱,如果可能的话,我想避免这种情况。
【问题讨论】:
标签: c++ qt shared-libraries dllexport qtestlib