2011-12-05 21 views
2

我在我的項目中有一堆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的?我不是軟件設計專家,但在這種情況下,解耦越好越好。 希望我的解釋夠好。

+0

你以什麼方式將你的項目視爲混亂?你擔心你是從另一個DLL中導出MyMacro的東西嗎?或者你是否擔心,即使你不需要使用它,你需要從另一個DLL中包含一些DLL文件? –

+0

當然我很擔心需要#include我不需要的東西......但更糟的是創建一個鏈依賴項Dll1使用Dll2,然後Dll3使用Dll2的接口,但它也需要Dll1頭文件。也許這是應該的方式,它使我困擾我使用第三方庫的事實,無法回想任何我需要包含這些宏觀事物的場景,這可能是因爲它是在其預編譯頭文件或其他地方聲明的 – notNullGothik

回答

0

如果您使用ImageLoaderDll中MyMacroDll的DLL接口,那麼您有一個依賴項。 ImageLoaderDll應該包括_MyMacroDll.h,否則你不能正確調用它的功能。這與包括<string.h>時想要撥打strlen完全相同。