簡體   English   中英

c ++靜態庫依賴項,標頭包括標頭

[英]c++ static library dependencies, header including header

所以我正在努力將應用程序的體系結構升級為更具模塊化的設計。 這是一個C ++應用程序,如果我們要為特定目標進行構建,則使用底層的整體c庫,否則它使用不同的庫后端。

當前,應用程序前端代碼GUI代碼直接綁定到僅在一個目標上運行的整體式c庫。 完成的工作是將整體式c庫放入“模塊”中,該模塊公開了公共的C ++接口,供應用程序的GUI部分使用。 這樣,我們可以更改構建目標,而GUI代碼不會更改。 先前存在的GUI代碼使用C庫中定義的結構,這些結構對於所有可能的c庫都是公用的。

在C ++模塊中,我定義了如下所示的排序代理類型:

//ModuleTypes.hpp
typedef CPP_TYPE C_LEGACY_TYPE;

並且GUI代碼僅使用CPP_TYPE代替了先前存在的C_LEGACY_TYPE。

在模塊項目的其他地方,Module.hpp看起來像:

//Module.hpp
#include "C_LEGACY_TYPES.hpp"
...
#include "ModuleTypes.hpp"

因此,當C ++模塊被編譯成靜態庫時,Module.hpp在ModuleTypes.hpp之前包含C_LEGACY_TYPES.hpp(因此ModuleTypes.hpp知道C_LEGACY_TYPE是什么),並且靜態庫可以正常編譯。

問題出在GUI模塊中,例如:

//Gui1.hpp
class Gui1 {
    void Method1(CPP_TYPE value);
};

由於無法預先聲明CPP_TYPE,因此在頂部向Gui1.hpp添加#include“ ModuleTypes.hpp”。

//Gui1.hpp
#include "ModuleTypes.hpp"
class Gui1 {
    void Method1(CPP_TYPE value);
};

當我去編譯GUI模塊時,它出錯了,因為它無法弄清楚C_LEGACY_TYPE是什么。 解決此問題的唯一方法是在ModuleTypes.hpp中#include“ C_LEGACY_TYPE.hpp”。 但是,這導致GUI在編譯時必須知道舊式C頭在哪里。

我希望GUI.hpp包含#include“ ModuleTypes.hpp”,但使用靜態庫中C_LEGACY_TYPE的定義,而不必在“ ModuleTypes.hpp”中包含#include“ C_LEGACY_TYPES.h”。

我知道為什么會發生錯誤,我正在尋找替代解決方案。 如何在編譯GUI模塊時如何使GUI模塊能夠使用ModuleTypes.hpp中定義的類型而不必包括舊標頭?

隨着體系結構的更改,我們正在遷移C ++ 11,因此我願意接受任何建議。 我們正在使用VC2010。

通過將后端C庫分離在公共接口層(包裝器類)之后,您可以做正確的事,因此以后可以輕松地用其他東西替換后端。

但是,您還需要確保在C類庫的接口中使用的類型在包裝器類中類似地隔離。 由於您的GUI層需要包含C_LEGACY_TYPE.hpp頭文件,因此我懷疑您的類型未得到應有的隔離。

這可能意味着您需要在包裝類中進行一些類型轉換,以將GUI知道的類型轉換為C庫使用的類型。 包裝類的接口(即公共接口)不得包含任何特定於后端C庫的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM