我有一個庫(我們稱之爲MyLib
),它具有以下結構:QTEST - 編寫基於Qt庫的測試和暴露類
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
來更精確地調整,這可以通過項目的設置進行設置,並且只有在定義了所有沒有前綴的類時纔會得到一個,否則它們將不會暴露。雖然這個解決方案很可能會做到這一點,但它會產生一個代碼混亂,如果可能的話,我想避免這種混亂。
我決定在'我的圖書館的項目文件中使用'#ifdef'和define。當定義變量時,我導出所有東西,否則只是我實際想要導出的幾個類。您的解決方案當然完全有效。 – rbaleksandar