0

我有一个库(我们称之为MyLib),它具有以下结构:

  • mylib_global.h - 确定在编写使用库的应用程序时是否Q_DECL_IMPORTQ_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,并且只有在定义时,所有没有前缀的类都会得到一个,否则它们将不会被暴露。虽然这个解决方案很可能会成功,但它会造成代码混乱,如果可能的话,我想避免这种情况。

4

1 回答 1

0

因为很多功能没有导出,所以您已经决定不测试最终交付物:您不能只获取最终产品并在其上运行测试工具。

然后,最简单的解决方案是将所有标头/源包含到测试工具本身中。

您可以将源和标头列表分解到一个单独的文件中,该文件将包含在可交付成果和测试工具的项目文件中。这在 cmake 和 qmake 中都很容易做到。

于 2016-11-03T13:38:04.137 回答