2016-04-15 42 views
2

我使用庫來控制設備。這個庫是用C語言編寫的。該庫有一個全局變量來保存設備ID(端口號)。這個庫提供了一個函數來確定我們使用哪個端口。像類一樣隔離C庫(C++代碼)

initialize(int deviceIndex, int baudrate) 

該函數改變全局變量。所有其他函數都使用這個全局變量。

我可以用這個庫控制一個設備;不過,我想同時控制兩個設備。

如果我使用這個函數兩次,全局變量改變了,我丟失了一個設備。

我用C++編寫我的代碼。我想知道是否有任何方法可以使用這個庫兩次,就像我們創建幾個對象的類,甚至每個類的公共變量都是獨立的。

編輯:

  1. 有依賴於平臺的方式。你在哪個平臺上?

我應該在這兩個的Visual C寫的代碼++(Windows)和Qt的C++(Linux的Kubuntu的)

  • 可以更改該庫的源代碼?
  • 是的,我可以,但它是約2000線和4檔(二.C和兩個.h)中

    +0

    有依賴於平臺的方式。你在哪個平臺上? – Dani

    +0

    您接受哪種可能的解決方案?重寫這個庫是最簡單和可靠的變體。 – fghj

    +0

    你可以更改該庫的源代碼嗎? –

    回答

    4

    我想知道是否有任何的方式來兩次使用這個庫。

    在一個進程中,您只能有一個庫及其符號(全局函數和變量)實例(不管它是靜態庫還是共享庫)。如果你需要不止一個,那麼產生更多的流程。

    您可以將此功能包裝在類中,以便當您創建該類的對象時,它會自動爲您生成一個輔助子進程,並且其成員函數使用某種形式的IPC與該特定子進程進行通信例如管道,套接字對,共享內存,文件等)。

    +0

    如果庫的源可用,可以將其全局變量重新定義爲線程本地,並使用線程而不是進程 – fghj

    +0

    @ user1034749正確。 –

    +1

    另一種方法是將該全局變量視爲需要由包裝C++類保存和恢復的上下文。但是,更好的方法是破解庫並定位全局變量。 –

    1

    擁有設備ID的全局變量可能不是您嘗試將此庫用於多個設備時必須面對的唯一問題。該庫可能會定義一堆其他全局或靜態變量。

    更糟糕的是,庫執行的與設備通信的底層I/O可能不能與多個設備同時兼容。因此,首先應該做的第一個測試就是像在兩個不同的可執行文件中一樣運行庫,並檢查每個進程是否可以同時使用不同的設備。

    如果這樣做很好,你可以選擇Maxim建議的解決方案,或嘗試將你的庫包裝到一個或多個類中。對於後者,確保在代碼中找到所有全局變量和靜態變量(這不應該太難),並使它們成爲類的成員。