我有一個用C++編寫的應用程序。我必須在這個應用程序中使用兩個DLL。如何用我的代碼編譯兩個相似的頭文件,以便在其上運行2個DLL
兩個Dll分別是MitaiClient.dll
和MitaiDriver.dll
。對於這兩個DLL我有lib文件和頭文件。對於每個DLL,我都有一個頭文件,但兩者都具有相同的名稱mtai.h
。 這兩個頭文件中聲明的結構具有相同的名稱,但它們的定義不同。
請建議如何使用這兩個頭文件編譯我的代碼,以便我的應用程序可以同時使用這兩個DLL。
我有一個用C++編寫的應用程序。我必須在這個應用程序中使用兩個DLL。如何用我的代碼編譯兩個相似的頭文件,以便在其上運行2個DLL
兩個Dll分別是MitaiClient.dll
和MitaiDriver.dll
。對於這兩個DLL我有lib文件和頭文件。對於每個DLL,我都有一個頭文件,但兩者都具有相同的名稱mtai.h
。 這兩個頭文件中聲明的結構具有相同的名稱,但它們的定義不同。
請建議如何使用這兩個頭文件編譯我的代碼,以便我的應用程序可以同時使用這兩個DLL。
因此,例如,你有客戶端/ 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;
我也考慮過這個解決方案,但我不知道它是否會起作用,因爲最終的exe文件將與2個DLL(已編譯)同時鏈接,並且此鏈接可能(也可能會)失敗。但這只是一個猜測。 –
它應該能夠工作,因爲結構體的名稱等只是爲了編程人員的利益 - 一旦編譯完成,所有代碼都會被清除,代碼只是使用內存地址。這些dll處於不同的內存地址,並且沒有彼此之間的引用,所以它應該沒有關係。 – benjymous
他們真的被剝離或他們被損壞(http://en.wikipedia.org/wiki/Name_mangling)?我認爲這是第二個,但我可能是錯的。我有點新鮮。 –
工作文件。 –
@AlexFarber - 這不會違反一個定義規則,因爲代碼幾乎是相同的,如果它在同一個(或全局)命名空間..我認爲這會導致鏈接錯誤。 –