2013-11-21 21 views
1

我有一個用C++編寫的應用程序。我必須在這個應用程序中使用兩個DLL。如何用我的代碼編譯兩個相似的頭文件,以便在其上運行2個DLL

兩個Dll分別是MitaiClient.dllMitaiDriver.dll。對於這兩個DLL我有lib文件和頭文件。對於每個DLL,我都有一個頭文件,但兩者都具有相同的名稱mtai.h。 這兩個頭文件中聲明的結構具有相同的名稱,但它們的定義不同。

請建議如何使用這兩個頭文件編譯我的代碼,以便我的應用程序可以同時使用這兩個DLL。

+1

工作文件。 –

+0

@AlexFarber - 這不會違反一個定義規則,因爲代碼幾乎是相同的,如果它在同一個(或全局)命名空間..我認爲這會導致鏈接錯誤。 –

回答

0

因此,例如,你有客戶端/ mtai.h

#pragma once 

struct mtai 
{ 
    int clientData; 
}; 

驅動器/ mtai.h

#pragma once 

struct mtai 
{ 
    int driverdata; 
}; 

如果包括這些,你會得到一個錯誤,因爲struct mtai定義了兩次。

爲了解決這個問題,你可以迫使包括到自己的命名空間,像這樣

namespace driver 
{ 
    #include "driver/mtai.h" 
} 
namespace client 
{ 
    #include "client/mtai.h" 
} 

然後在不同的源這些標題命名空間中使用它們

client::mtai dataClient; 
dataClient.clientData = 42; 

driver::mtai dataDriver; 
dataDriver.driverdata = 1234; 
+0

我也考慮過這個解決方案,但我不知道它是否會起作用,因爲最終的exe文件將與2個DLL(已編譯)同時鏈接,並且此鏈接可能(也可能會)失敗。但這只是一個猜測。 –

+0

它應該能夠工作,因爲結構體的名稱等只是爲了編程人員的利益 - 一旦編譯完成,所有代碼都會被清除,代碼只是使用內存地址。這些dll處於不同的內存地址,並且沒有彼此之間的引用,所以它應該沒有關係。 – benjymous

+0

他們真的被剝離或他們被損壞(http://en.wikipedia.org/wiki/Name_mangling)?我認爲這是第二個,但我可能是錯的。我有點新鮮。 –

相關問題