我在我的項目中有一堆Dll,使用VStudio 9.0編譯器,預編譯頭文件用於我所有的Dll。 dll的加載過程由隱式調用者完成(必須提供.dll,.lib和頭文件)。動態庫;如何解決無用的依賴關係?
我通常每創建一個DLL不同的宏定義文件,例如,如果我目前的DLL被稱爲MYMacroDll我添加一個文件_MyMacroDll.h其中包含:
#ifndef _MYMACRODLL_H_
#define _MYMACRODLL_H_
#ifdef _WIN32
#ifdef MYMACRODLL_EXPORTS
#define MYMACRODLL_API __declspec(dllexport)
#else
#define MYMACRODLL_API __declspec(dllimport)
#endif
#define MYMACRODLL_CALL __cdecl
#else
#define MYMACRODLL_API
#define MYMACRODLL_CALL
#endif
#endif
我知道代碼可以簡化但我一直對便攜性的最後一個定義,至少,這就是我的理解......
預編譯的頭文件pch.h,總是包含宏定義文件_MyMacroDll.h,這讓我對事情變得更加容易,因爲以後我可以決定一個新的類或函數是否會進行接口連接。這到目前爲止工作正確。
混淆來自使用另一個DLL中的dll接口;讓我們假設第二個DLL ImageLoaderDll。這個使用_MyMacroDll中的一個(或多個)接口類/函數的實例或引用。我一眼就猜到了,沒有必要包括_MyMacroDll.h的,但編譯ImageLoaderDll當它與
error C2470: '_AnInterfaceClassFromMyMacro' : looks like a function definition, but there is no parameter list; skipping apparent body
然後我必須包括_MyMacroDll.h在其他的預編譯頭文件中抱怨Dll,我的項目變得非常混亂,我發現越來越無用的依賴關係。 什麼做錯了?是否有另外一種方法來設置宏定義,這樣我就可以避免將它添加到客戶端Dll的?我不是軟件設計專家,但在這種情況下,解耦越好越好。 希望我的解釋夠好。
你以什麼方式將你的項目視爲混亂?你擔心你是從另一個DLL中導出MyMacro的東西嗎?或者你是否擔心,即使你不需要使用它,你需要從另一個DLL中包含一些DLL文件? –
當然我很擔心需要#include我不需要的東西......但更糟的是創建一個鏈依賴項Dll1使用Dll2,然後Dll3使用Dll2的接口,但它也需要Dll1頭文件。也許這是應該的方式,它使我困擾我使用第三方庫的事實,無法回想任何我需要包含這些宏觀事物的場景,這可能是因爲它是在其預編譯頭文件或其他地方聲明的 – notNullGothik