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.\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要方便一些

原文地址:https://www.cnblogs.com/achillis/p/9383762.html

时间: 2024-08-03 17:21:43

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

[Android] 一份代码,两个版本

维护同一份代码,编译两个版本,需要修改包名.具体如下: (1)右击项目名称 --> Android Tools --> Rename Application Package ,一键修改包名 (2)在同一个手机上同时安装这两个版本时,会提示INSTALL_FAILED_CONFLICTING_PROVIDER 错误,解决办法是修改AndroidManifest.xml中provider的android:authorities值,例如: 在版本V1中使用 <provider android:

向自己的模块添加错误代码_使用vc自带的工具MC创建资源并将其添加至DLL或EXE中

本文主要介绍怎么使用Visual Studio自带的MC.exe工具来创建一个消息资源并将其添加到自己的DLL(或.exe)中,从而达到为自己的模块添加错误代码的目的. 一.MC工具介绍 Message Compiler(MC) 是用来创建消息资源的工具,这些消息资源被DLL(或EXE)模块引用.MC的输入是一个特定格式的文本文件,即*.mc文件,这种特定格式使得在一个文件中定义多种语言支持变得非常容易. 当编写完成一个*.mc文件之后,为了在程序中使用这个文件,你需要一些操作.首先,使用MC工

如何写一份代码让编译器编译很久

这个周末有幸见到了几位神交已久的库友(天天/迪迪/丁丁),大家一起扯了些有的没的,很开森! 丁丁又提起我曾经提出的那个问题"如何写一份代码让编译器编译很久?" 我记得当时我在群里提出这个问题时,波波和我首先想到的是利用C++的模板,让模板递归嵌套,或许会编译很久. 我测试发现gcc在模板递归嵌套500层之后就报错退出了,这个法子行不通. 后来我换了个法子达到了编译很久的目的,原理超级简单,一看代码便知: template <unsigned A, unsigned B> s

如何加快C++代码的编译速度 转

http://www.cnblogs.com/baiyanhuang/archive/2010/01/17/1730717.html C++代码一直以其运行时的高性能高调面对世人, 但是说起编译速度,却只有低调的份了.比如我现在工作的源代码,哪怕使用Incredibuild调动近百台机子,一个完整的build也需要四个小时,恐怖!!!虽然平时开发一般不需要在本地做完整的build,但编译几个相关的工程就够你等上好一段时间的了(老外管这个叫monkey around,相当形象).想想若干年在一台单

VC++DUIEngine界面编程1--学习编译及配置DUIEngine项目

1. 为什么要用DUIEngine: DUIEngine的作者是:启程软件.在此感谢他为此项目所付出的心血,能为我们这些界面爱好者,奉献了宝贵的时间以及优秀的代码. DUIE的优势为: 1. 作者将金山的BKWin进行了深度改写,从而使之更易于使用和开发.相比传统的WTL而言,DUIE增加了许多窗口特效,如动态缩放窗口,3D界面旋转.从而使开发者能够在较短时间内开发出比较炫丽的界面特效. 2. 结合了MFC及WTL开发者的开发习惯,使开发者能够在较短时间内接受DUIE的开发模式. 3. 作者长时

如何阅读一份代码?

https://zhuanlan.zhihu.com/p/26222486 ****************************** 上文谈到了像读书一样阅读源码的重要性,今天谈谈如何阅读一份代码.我所谓的一份代码,其范围可能从几千行到数万行,有时甚至可多达数十万行.这些代码作为一个有机体,共同完成某些重要的功能.比如说几个著名的 full fledged web framework,祖师爷 rails,师叔 django 和小师妹 phoenix: 三者对比很有意思 - rails / d

生成具备语法高亮、缩进、可折叠和主动提示的代码反编译控件Spices .Net Decompiler

Spices .Net Decompiler控件是一款功能强大的代码恢复和反编译工具,支持转换.NET二进制格式((.EXE或.DLL)为格式化的.最佳的源代码,支持MSIL, C#, VB.NET, Delphi.NET, J# 和可管理的C++.具体功能: 转换后的代码具备良好的格式:生成的代码具备语法高亮.缩进.可折叠和主动提示 支持可视的进行反编译 正确的反编译所有类型的程序集:managed (C#, VB.NET, Delphi.NET), CompactFramework and

Maven配置插件跳过测试代码的编译和运行

Maven配置插件跳过测试代码的编译和运行: <!-- 编译插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.7</source> <target>1.7</targe

React-Native 开发 android & ios App,共享一份代码

React-Native 开发的App, 所有组件ios & android 共用, 共享一份代码 包括一些自定义的组件, 如NavigationBar, TabBar, SegmentedControl, 使用字体图标, 具有一定的参考意义 主要专注于布局, 共享组件/代码, 以及一些React自带的组件, 如: ScrollView, TouchableOpacity, View, Text, ListView, Image, WebView 和 Api的使用, 这并不是一个完整版, 只是业