VC将同一份代码同时编译为Dll和Exe的方法

Posted achillis

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC将同一份代码同时编译为Dll和Exe的方法相关的知识,希望对你有一定的参考价值。

开发中经常遇到这样的情况,需要开发一个某某功能的接口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.
")
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的方法的主要内容,如果未能解决你的问题,请参考以下文章

什么叫静态库和动态库

如何将 .NET EXE 反编译为可读的 C# 源代码?

vc中如何将dll件和exe编译成一个exe文件?

将 C++ .exe 项目转换为 dll

将 EXE 反编译为 ASM

用于 C++ 的 C# 包装器,但仅编译为静态库