1. 程式人生 > >VC將同一份代碼同時編譯為Dll和Exe的方法

VC將同一份代碼同時編譯為Dll和Exe的方法

導出函數 接口 bool mod spa 新增 arpspoof 配置 影響

開發中經常遇到這樣的情況,需要開發一個某某功能的接口Dll,但是Dll不能直接調試,你至少需要一個Loader

但是Loader和Dll本身不在同一個工程裏,雖然都在本機的話並不影響源碼級調試,但是總感覺如果同一個工程既能作為Dll又能做為獨立Exe的話,調試起來會更加方便些

或者是本來有個控制臺版本的Demo,想要修改為Dll形式(一般先寫Demo驗證思路,所以先Console後Dll的情況會多一些)

所以,就有了本方法,並非原創

其實主要思路就是利用宏實現條件編譯

獨立Exe測試時經常編譯為控制臺程序,默認會有一個宏叫做_CONSOLE,入口函數是main

編譯為Dll時,有一個宏叫做_USRDLL,入口函數是DllMain

所以你可以把代碼這麽改:

 1 #ifdef _CONSOLE
 2 
 3 int main(int argc,char *argv[])
 4 {
 5     //設置相關參數並調用功能函數,便於調試
 6     return 0;
 7 }
 8 
 9 #else //_USRDLL
10 
11 #pragma message("Compile as Dll.\n")
12 
13 //如果使用了def文件來定義導出接口,不要直接加到工程裏,否則編譯成exe時也會有導出函數,不過並不影響調試
14 #pragma comment(linker,"/DEF:ARPSpoof.def")
15
16 BOOL APIENTRY DllMain( HANDLE hModule, 17 DWORD ul_reason_for_call, 18 LPVOID lpReserved //可以用作某些特殊標誌 19 ) 20 { 21 22 return TRUE; 23 } 24 25 #endif

然後基於控制臺版本新增加一個編譯配置,去掉_CONSOLE宏,加上_USRDLL宏,並且在Link命令參數裏加上“/dll”就可以了。

相對來說,還是比單獨的Loader要方便一些

VC將同一份代碼同時編譯為Dll和Exe的方法