Visual C++ 6.0下用命令行编译C++控制台程序



CL [option...] file... [option | file]... [lib...] [@command-file] [/link link-opt...]

下表说明CL 命令的输入项意义

option 一个或多个 CL 选项。请注意,所有选项都应用于所有指定的源文件。选项是由一个正斜杠 (/) 或一个短划线 (–) 指定的。如果某个选项带有参数,则该选项的说明指定在选项和参数之间是否允许有空格。选项名(/HELP 选项除外)区分大小写。有关更多信息,请参阅 CL 选项的顺序。

file 一个或多个源文件、.obj 文件或库的名称。CL 编译源文件并将 .obj 文件和库的名称传递给链接器。有关更多信息,请参阅 CL 文件名语法。

lib 一个或多个库名。CL 将这些名称传递给链接器。

command-file 包含多个选项和文件名的文件。有关更多信息,请参阅 CL 命令文件。

link-opt 一个或多个链接器选项。CL 将这些选项传递给链接器。

您可以指定任意数目的选项、文件名和库名,条件是命令行上的字符数不超过 1024,该限制是操作系统指定的。

大 家可能一直在用VC开发软件,但是对于这个编译器却未必很了解。原因是多方面的。大多数情况下,我们只停留在“使用”它,而不会想去“了解”它。因为它只 是一个工具,我们宁可把更多的精力放在C++语言和软件设计上。我们习惯于这样一种“模式”:建立一个项目,然后写代码,然后编译,反反复复调试。但是, 所谓:“公欲善其事,必先利其器”。如果我们精于VC开发环境,我们是不是能够做得更加游刃有余呢?

闲话少说。我们先来看一下VC的处理流程,大致分为两步:编译和连接。源文件通过编译生成了。obj文件;所有。obj文件和。lib文件通过连接生成。exe文件或。dll文件。下面,我们分别讨论这两个步骤的一些细节。

编译参数的设置。主要通过VC的菜单项Project->Settings->C/C++页来完成。我们可以看到这一页的最下面Project Options中的内容,一般如下:

    /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_M BCS" /Fp"Debug/WritingDlgTest.pch" /Yu"stdafx.h" /Fo"Debug/" /Fd"Debug/" /FD /GZ /c

    各个参数代表的意义,可以参考Msdn.比如/nologo表示编译时不在输出窗口显示这些设置(我们可以把这个参数去掉来看看效果)等等。一般我们不会直接修改这些设置,而是通过这一页最上面的Category中的各项来完成。

    1) General: 一些总体设置。Warning level用来控制警告信息,其中Level 1是最严重的级别;Warnings as errors将警告信息当作错 误处理;Optimizations是代码优化,可以在Category的Optimizations项中进行更细的设 置;Generate browse info用以生成。sbr文件,记录类、变量等符号信息,可以在Category的Listing Files项中 进行更多的设置。Debug info,生成调试信息:None,不产生任何调试信息(编译比较快);Line Numbers Only,仅生成全局的 和外部符号的调试信息到。OBJ文件或。EXE文件,减小目标文件的尺寸;C 7.0- Compatible,记录调试器用到的所有符号信息到。OBJ 文件和。EXE文件;Program Database,创建。PDB文件记录所有调试信 息;Program Database for "Edit & Continue",创建。PDB文件记录所有调试信息,并且支持调试时编辑。

    2) C++ Language:pointer_to_member representation 用来设置类定义/引用的先后关系,一般为Best-Case Always表示在引用类之前该类肯定已经定义 了;Enable Exception Handling,进行同步的异常处理;Enable Run-Time Type Information迫使 编译器增加代码在运行时进行对象类型检查;Disable Construction Displacements,设置类构造/析构函数调用虚函数问 题。

    3) Code Generation:Processor表示代码指令优化,可以为80386、80486、 Pentium、Pentium Pro,或者Blend表示混合以上各种优化。Use run-time library用以指定程序运行时使用的运行 时库(单线程或多线程,Debug版本或Release版本),有一个原则就是,一个进程不要同时使用几个版本的运行时库。Single- Threaded,静态连接LIBC.LIB库;Debug Single-Threaded,静态连接LIBCD.LIB 库;Multithreaded,静态连接LIBCMT.LIB库;Debug Multithreaded,静态连接LIBCMTD.LIB 库;Multithreaded DLL,动态连接MSVCRT.DLL库;Debug Multithreaded DLL,动态连接 MSVCRTD.DLL库。连接了单线程库就不支持多线程调用,连接了多线程库就要求创建多线程的应用程序。

    Calling convention 可以用来设定调用约定,有三种:__cdecl、__fastcall和__stdcall.各种调用约定的主要区别在于,函数调用时,函数的参数是从左 到右压入堆栈还是从右到左压入堆栈;在函数返回时,由函数的调用者来清理压入堆栈的参数还是由函数本身来清理;以及在编译时对函数名进行的命名修饰(可以 通过Listing Files看到各种命名修饰方式)。Struct member alignment用以指定数据结构中的成员变量在内存中是按几字 节对齐的,根据计算机数据总线的位数,不同的对齐方式存取数据的速度不一样。这个参数对数据包网络传输等应用尤为重要,不是存取速度问题,而是数据位的精 确定义问题,一般在程序中使用#pragma pack来指定。

    4) Customize:Disable Language Extensions,表示不使用微软为标准C做的语言扩展;Eliminate Duplicate Strings,主要用于字符串优化(将字符串放到缓充池里以节省空间),使用这个参数,使得

    char *sBuffer = "This is a character buffer";

    char *tBuffer = "This is a character buffer";

    sBuffer 和tBuffer指向的是同一块内存空间;Enable Function-Level Linking ,告诉编译器将各个函数按打包格式编 译;Enables minimal rebuild,通过保存关联信息到。IDB文件,使编译器只对最新类定义改动过的源文件进行重编译,提高编译速 度;Enable Incremental Compilation,同样通过。IDB文件保存的信息,只重编译最新改动过的函 数;Suppress Startup Banner and Information Messages,用以控制参数是否在output窗口输出。

    5) Listing Files:Generate browse info 的功能上面已经提到过。这里可以进行更多的设置。Exclude Local Variables from Browse Info表示是否将局部变量 的信息放到。SBR文件中。Listing file type可以设置生成的列表信息文件的内容:Assembly-Only Listing仅生成汇 编代码文件(。ASM扩展名);Assembly With Machine Code生成机器代码和汇编代码文件(。COD扩展 名);Assembly With Source Code生成源代码和汇编代码文件(。ASM扩展 名);Assembly, Machine Code,and Source生成机器码、源代码和汇编代码文件(。COD扩展名)。 Listing file name为生成的信息文件的路径,一般为Debug或Release目录下,生成的文件名自动取源文件的文件名。

    6) Optimizations:代码优化设置。可以选择Maximize Speed生成最快速的代码,或Minimize Size生成最小尺寸的程序,或者Customize定制优化。定制的内容包括:

    Assume No Aliasing,不使用别名(提高速度);

    Assume Aliasing Across Function Calls,仅函数内部不使用别名;

    Global Optimizations,全局优化,比如经常用到的变量使用寄存器保存,或者循环内的计算优化,如

    i = -100;

    while( i < 0 ){ i += x + y;}

    会被优化为

    i = -100;

    t = x + y;

    while( i < 0 ){i += t;}

Generate Intrinsic Functions,使用内部函数替换一些函数调用(提高速度);

Improve Float Consistency,浮点运算方面的优化;

Favor Small Code,程序(exe或dll)尺寸优化优先于代码速度优化;

Favor Fast Code,程序(exe或dll)代码速度优化优先于尺寸优化;

Frame-Pointer Omission,不使用帧指针,以提高函数调用速度;

Full Optimization,组合了几种参数,以生成最快的程序代码。

Inline function expansion,内联函数扩展的三种优化(使用内联可以节省函数调用的开销,加快程序速度):Disable不使用内联;Only __inline,仅函数定义前有inline或__inline标记使用内联;Any Suitable,除了inline或__inline标记的函数外,编译器“觉得”应该使用内联的函数,都使用内联。


7) Precompiled Headers:预编译头文件的设置。使用预编译可以提高重复编译的速度。VC一般将一些公共的、不大变动的头文件(比如afxwin.h等)集中放到 stdafx.h中,这一部分代码就不必每次都重新编译(除非是Rebuild All)。

8) Preprocessor:预编译处理。可以定义/解除定义一些常量。Additional include directories,可以指定额外的包含目录,一般是相对于本项目的目录,如……/Include.

连接参数的设置。主要通过VC的菜单项Project->Settings->Link页来完成。我们可以看到这一页的最下面Project Options中的内容,一般如下:

/nologo /subsystem:windows /incremental:yes /pdb:"Debug/WritingDlgTest.pdb" /debug /machi ne:I386 /out:"Debug/WritingDlgTest.exe" /pdbtype:sept

下面我们分别来看一下Category中的各项设置。

1) General:一些总体设置。可以设置生成的文件路径、文件名;连接的库文件;Generate debug info,生成Debug信息到。PDB文件(具体格式可以在Category->Debug中设置);Ignore All Default Libraries,放弃所有默认的库连接;Link Incrementally,通过生成。 ILK文件实现递增式连接以提高后续连接速度,但一般这种方式下生成的文件(EXE或DLL)较大;Generate Mapfile,生成。MAP文件记录模块相关信息;Enable Profiling,这个参数通常与Generate Mapfile参数同时使用,而且如果产生Debug信息的话,不能用。PDB文件,而且必须用Microsoft Format.

2) Customize:这里可以进行使用程序数据库文件的设置。Force File Output ,强制产生输出文件(EXE或DLL);Print Progress Messages,可以将连接过程中的进度信息输出到Output窗口。

3) Debug:设置是否生成调试信息,以及调试信息的格式。格式可以有Microsoft Format、COFF Format(Common Object File Format)和Both Formats三种选择;Separate Types,表示将Debug格式信息以独立的。PDB文件存放,还是直接放在各个源文件的。PDB文件中。选中的话,表示采用后者的方式,这种方式调试 启动比较快。

4) Input:这里可以指定要连接的库文件,放弃连接的库文件。还可以增加额外的库文件目录,一般是相对于本项目的目录,如……/Lib.Force Symbol References,可以指定连接特定符号定义的库。

5) Output:Base Address可以改变程序默认的基地址(EXE文件默认为0x400000,DLL默认为x10000000),操作系统装载一个程序时总是试着先从这 个基地址开始。Entry-Point Symbol可以指定程序的入口地址,一般为一个函数名(且必须采用__stdcall调用约定)。一般Win32的程序,EXE的入口为 WinMain,DLL的入口为DllEntryPoint;最好让连接器自动设置程序的入口点。默认情况下,通过一个C的运行时库函数来实现:控制台程 序采用mainCRTStartup (或wmainCRTStartup)去调用程序的main (或wmain)函数;Windows程序采用WinMainCRTStartup (或 wWinMainCRTStartup)调用程序的WinMain (或 wWinMain,必须采用__stdcall调用约定);DLL采用_DllMainCRTStartup调用DllMain函数(必须采用 __stdcall调用约定)。Stack allocations,用以设置程序使用的堆栈大小(请使用十进制),默认为1兆字节。Version Information告诉连接器在EXE或DLL文件的开始部分放上版本号。

值得注意的是,上面各个参数是大小写敏感的;在参数后加上“-”表示该参数无效;各个参数值选项有“*”的表示为该参数的默认值;可以使用页右上角的“Reset”按钮来恢复该页的所有默认设置。

其它一些参数设置

1) Project->Settings->General,可以设置连接MFC库的方式(静态或动态)。如果是动态连接,在你的软件发布时不要忘了带上MFC的DLL.

2) Project->Settings->Debug,可以设置调试时运行的可执行文件,以及命令行参数等。

3) Project->Settings->Custom Build,可以设置编译/连接成功后自动执行一些操作。比较有用的是,写COM时希望VC对编译通过的COM文件自动注册,可以如下设置:

Description: Register COM

Commands: regsvr32 /s /c $(TargetPath)

echo regsvr32 exe.time > $(TargetDir)/$(TargetName)。trg

Outputs: $(TargetDir)/$(TargetName)。trg

4) Tools->Options->Directories,设置系统的Include、Library路径。

一些小窍门

1)有时候,你可能在编译的时候,计算机突然非法关机了(可能某人不小心碰了电源或你的内存不稳定等原因)。当你重启机器后打开刚才的项目,重新进行编 译,发现VC会崩掉。你或许以为你的VC编译器坏了,其实不然(你试试编译其它项目,还是好的!),你只要将项目的。ncb、。opt、。aps、。 clw文件以及Debug、Release目录下的所有文件都删掉,然后重新编译就行了。

2) 如果你想与别人共享你的源代码项目,但是把整个项目做拷贝又太大。你完全可以删掉以下文件:。dsw、。ncb、。opt、。aps、。clw、。 plg文件以及Debug、Release目录下的所有文件。

3)当你的Workspace中包含多个Project的时候,你可能不能直观地、一眼看出来哪个是当前项目。可以如下设 置:Tools->Options->Format,然后在Category中选择Workspace window,改变其默认的字体(比如设成Fixedsys)就行了。

4) 如何给已有的Project改名字?将该Project关掉。然后以文本格式打开。dsp文件,替换原来的Project名字即可。

5) VC6对类成员的智能提示功能很有用,但有时候会失灵。你可以先关掉项目,将。clw和。ncb删掉,然后重新打开项目,点击菜单项 View->ClassWizard,在弹出的对话框中按一下“Add All”按钮;重新Rebuild All.应该可以解决问题。
1.基于对话框(/单文档/多文档)的MFC程序
预编译头文件stdafx.h:
#define VC_EXTRALEAN     // Exclude rarely-used stuff from Windows headers

// afxwin.h中声明了MFC封装的一些很基本的类(CWnd、CView、CButton、CDC等)
#include <afxwin.h>         // MFC core and standard components
// afxext.h中声明了MFC的一些扩展类(CBitmapButton、CControlBar、CSplitterWnd等)
#include <afxext.h>         // MFC extensions
// afxdisp.h中声明了Ole的几个类(COleException、COleVariant等)
#include <afxdisp.h>        // MFC Automation classes
// afxdtctl.h中声明了几个控件类(CImageList、CMonthCalCtrl、CDateTimeCtrl等)
#include <afxdtctl.h>       // MFC support for Internet Explorer 4 Common Controls

#ifndef _AFX_NO_AFXCMN_SUPPORT
// afxcmn.h中声明了MFC常用的一些控件类(CListCtrl、CProgressCtrl、CToolTipCtrl等)
#include <afxcmn.h>            // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT

(1.1)Use MFC in a Shared DLL
Debug版本:
预定义:WIN32,_DEBUG,_WINDOWS,_AFXDLL,_MBCS
编 译参 数:/nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /FR"Debug /" /Fp"Debug/ExeDlg.pch" /Yu"stdafx.h" /Fo"Debug/" /Fd"Debug/" /FD /GZ   /c
连 接参数:/nologo /subsystem:windows /incremental:yes /pdb:"Debug /ExeDlg.pdb" /debug /machine:I386 /out:"Debug/ExeDlg.exe" /pdbtype:sept

Release版本:
预定义:与Debug版本相比,将_DEBUG替换成了NDEBUG
编 译参 数:/nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Fp"Release /ExeDlg.pch" /Yu"stdafx.h" /Fo"Release/" /Fd"Release/" /FD /c
连接参数:/nologo /subsystem:windows /incremental:no /pdb:"Release/ExeDlg.pdb" /machine:I386 /out:"Release/ExeDlg.exe"

(1.2)Use MFC in a Static Library
Debug版本:
预定义:与(1.1)相比,少了_AFXDLL
编译参数:将/MDd(使用Run-time library: Debug Multithreaded DLL)换成了/MTd(使用Run-time library: Debug Multithreaded)
连接参数:与(1.1)相同

Release版本:
编译参数/MD(使用Run-time library: Multithreaded DLL)换成了MT(使用Run-time library: Multithreaded)

***备注:以上编译/连接参数含义如下(更多的,请参考Msdn):
/nologo: 抑制信息在编译或者连接时在Output Window输出;   /MD:运行时库使用MSVCRT.DLL;   /W3:编译时显示为 Warning的级别为3;   /Gm:Enable Minimal Rebuild,一种减少重编译的选 项;  /GX:Enable Exception Handling;     /ZI:设置Debug信息保存的数据库文件.PDB 中;    /Od:Disable代码优化;     /FR:生成.SBR文件,包含有符号信息;       /Fp:命名生成的预编译头文 件;     /Yu:指定预编译头文件。




/
2.MFC DLL项目
预编译头文件stdafx.h:
#define VC_EXTRALEAN        // Exclude rarely-used stuff from Windows headers

#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions

#ifndef _AFX_NO_OLE_SUPPORT
#include <afxole.h>         // MFC OLE classes
#include <afxodlgs.h>       // MFC OLE dialog classes
#include <afxdisp.h>        // MFC Automation classes
#endif // _AFX_NO_OLE_SUPPORT


#ifndef _AFX_NO_DB_SUPPORT
#include <afxdb.h>            // MFC ODBC database classes
#endif // _AFX_NO_DB_SUPPORT

#ifndef _AFX_NO_DAO_SUPPORT
#include <afxdao.h>            // MFC DAO database classes
#endif // _AFX_NO_DAO_SUPPORT

#include <afxdtctl.h>        // MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>            // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT
增加了两个OLE的头文件和两个数据库的头文件

(2.1) Use MFC in a Shared DLL
Debug版本:
预定义:WIN32,_DEBUG,_WINDOWS,_WINDLL,_AFXDLL,_MBCS,_USRDLL,与MFC Exe程序相比,增加了_WINDLL和_USRDLL
编译参数:与MFC Exe没有太大区别
连 接参数:/nologo /subsystem:windows /dll /incremental:yes /pdb:"Debug /MFCDll.pdb" /debug /machine:I386 /def:"./MFCDll.def" /out:"Debug/MFCDll.dll" /implib:"Debug/MFCDll.lib" /pdbtype:sept
与MFC Exe相比,增加了/dll定义,以及/def:"./MFCDll.def"和/implib:"Debug/MFCDll.lib"。注意:其中MFCDll是测试的项目名字,非标准DLL名字。
从项目的文件上看,这个项目比MFC Exe多产生一个.def的文件用于定义导出函数。

Release版本与Debug版本的区别类似项目1中的比较(上了_AFXDLL定义)。

(2.2) Use MFC in a Static DLL
与(2.1)的区别,主要在使用的Run-time library类型上,与项目1中的比较。




/
3.MFC Extension DLL项目
预编译头文件stdafx.h内容与项目2相同。

(3.1) Use MFC in a Shared DLL
Debug版本:
预定义:WIN32,_DEBUG,_WINDOWS,_MBCS,_AFXEXT,_WINDLL,_AFXDLL,与项目2相比,将_USRDLL换成了_AFXEXT。
编译参数:与上述项目没有太大区别
连接参数:与MFC DLL项目相似

Release版本与Debug版本的区别类似项目1中的比较(上了_AFXDLL定义)。

(3.2) Use MFC in a Static DLL
类似以上项目的比较。




(注:以下项目均以Debug版本论述。)
/
4.Win32 DLL项目
预编译头文件stdafx.h:
#define WIN32_LEAN_AND_MEAN        // Exclude rarely-used stuff from Windows headers

#include <windows.h>

出现项目入口函数DllMain的实现。

(4.1) Not Using MFC
预 定义:WIN32,_DEBUG,_WINDOWS,_MBCS,_USRDLL,WIN32DLLDEMO_EXPORTS,与项目 2(MFC DLL)相比,少了_WINDLL,_AFXDLL,而仅保留了_USRDLL。另外,WIN32DLLDEMO_EXPORTS自定义的导 出宏。
编译参数:没有太大区别。
连接参 数:kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"Debug /Win32DllDemo.pdb" /debug /machine:I386 /out:"Debug/Win32DllDemo.dll" /implib:"Debug/Win32DllDemo.lib" /pdbtype:sept
与MFC DLL项目相比,多了很多库的连接,少了/subsystem:windows的定义。

(4.2) Use MFC in a Shared DLL
预定义:与(4.1)相比,增加了_WINDLL,_AFXDLL的定义
编译参数:没有太大区别。
连 接参数:/nologo /dll /incremental:yes /pdb:"Debug /Win32DllDemo.pdb" /debug /machine:I386 /out:"Debug/Win32DllDemo.dll" /implib:"Debug/Win32DllDemo.lib" /pdbtype:sept
可以看出,(4.1) 里连接的很多库消失了,这时,项目4变成了类似于项目2中的设置。
*** 但 是,编程时需要注意,项目4的stdafx.h仅包含了<windows.h>,此时如果要用MFC的类,需要自己加入MFC的几个头文件 (<afxwin.h>、<afxext.h>等),并且将#include <windows.h>和 DllMain入口函数注释掉!

(4.3) Use MFC in a Static DLL
使用MFC DLL的方式Shared和Static之间的区别与上述项目类似,不再做比较。



/
5.Win32 Static Library项目
预编译头文件stdafx.h(可能没有这个文件):
如果不使用MFC的话,仅仅#define WIN32_LEAN_AND_MEAN,而如果使用MFC,内容如下:
#define VC_EXTRALEAN        // Exclude rarely-used stuff from Windows headers

#include <afx.h>
#include <afxwin.h>

(5.1) Not Using MFC    
预定义:WIN32,_DEBUG,_MBCS,_LIB,新出现了符号_LIB
编 译参 数:/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /Fp"Debug /W32StaPrehead.pch" /Yu"stdafx.h" /Fo"Debug/" /Fd"Debug/" /FD /GZ  /c
注意到使用的Run-time library参数为/MLd。
库参数:这个项目没有Link设置页,代替的是Library页,参数如下:/nologo /out:"Debug/W32StaPrehead.lib"

(5.2) Use MFC in a Shared DLL
预定义:WIN32,_DEBUG,_WINDOWS,_MBCS,_AFXDLL,与项目1(MFC Exe)设置相同。
编译参数:注意使用的Run-time library参数为/MDd。
库参数:没有太大区别。

(5.3) Use MFC in a Static DLL
编译参数:注意使用的Run-time library参数为/MTd。



/
6.Win32 Application项目
预编译头文件stdafx.h
#define WIN32_LEAN_AND_MEAN    // Exclude rarely-used stuff from Windows headers

// Windows Header Files:
#include <windows.h>

// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>

出现了Win32程序的入口函数WinMain。

这 个项目,Project->settings->General中设置使用MFC的方式,一般设为Not Using MFC,否则程序结构 的改动比较大。从Not Using MFC到使用MFC的改变,对连接的库的影响类似于项目4(Win32 DLL)。

(6.1) Not Using MFC
预定义:WIN32,_DEBUG,_WINDOWS,_MBCS
编 译参 数:/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /Fp"Debug /W32StaPrehead.pch" /Yu"stdafx.h" /Fo"Debug/" /Fd"Debug/" /FD /GZ  /c
注意到使用的Run-time library参数为/MLd。
连 接参 数: kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /incremental:yes /pdb:"Debug /W32AppDemo.pdb" /debug /machine:I386 /out:"Debug/W32AppDemo.exe" /pdbtype:sept

(6.2) Use MFC in a Shared DLL
编译参数:注意使用的Run-time library参数为/MDd。

(6.3) Use MFC in a Static DLL
编译参数:注意使用的Run-time library参数为/MTd。




小结:
1.MFC的使用方式对默认情况选择的Run-time library的影响(以Debug版本为例):
Not Using MFC ---〉/MLd: Debug Single-Threaded(静态连接LIBCD.LIB库)
Use MFC in a Shared DLL ---〉/MDd: Debug Multithreaded DLL(动态连接MSVCRTD.DLL库)
Use MFC in a Static DLL ---〉/MTd: Debug Multithreaded(静态连接LIBCMTD.LIB库)

2.如果不使用MFC,在Link一栏一般会连接一系列Windows API的库文件;如果使用MFC,这些连接库就会“消失”。

3.Debug版本一般会有_DEBUG的预定义,而Release版本则定义NDEBUG。

4.使用Shared MFC和Static MFC相比,前者一般多一个_AFXDLL的定义。默认使用的Run-time Library也不一样,前者为/MDd,后者为/MTd。

5.MFC的普通DLL项目比MFC的EXE项目,一般多_WINDLL和_USRDLL预定义;连接参数多一个/dll定义。而MFC扩展DLL项目与MFC普通DLL项目相比,预定义将_USRDLL换成了_AFXEXT。

6.不使用MFC的Win32 DLL与MFC DLL相比,预定义少了_WINDLL和_AFXDLL,而仅保留了_USRDLL。

7.不使用MFC的静态库有_LIB的预定义。

8.#include <afxwin.h> 和#include <windows.h>不能重复包含,前者用于MFC程序,后者用于程序。

9.为了去掉Windows头文件中很少用到的定义,一般在stdafx.h中,Win32程序会定义#define WIN32_LEAN_AND_MEAN,而MFC程序会定义#define VC_EXTRALEAN。

10.作为本文的应用,改变项目参数设置,实现不同类型项目之间的项目转换,如下:
MFC Exe   <======> MFC DLL
  ||                  ||
  ||                  ||
  ||                  ||

Win32 Exe <======> Win32 DLL

[代码]   

1 CD /D E:\test
2 "C:\Program Files\Microsoft Visual Studio\VC98\Bin\cl.exe"/GX /W3 /I"E:\Program Files\Microsoft Visual Studio\VC98\Include"/c score.cpp
3 "C:\Program Files\Microsoft Visual Studio\VC98\Bin\link.exe"*.obj /LIBPATH:"C:\Program Files\Microsoft Visual Studio\VC98\Lib"

转载于:https://my.oschina.net/sitsit/blog/127894

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

第一章 Internet 网络编程基础知识 1 1.1 Internet的网络结构 1 1.1.1 网络拓扑结构 1 1.1.2 以太网技术 3 1.1.3 其他高速网络技术 4 1.1.4 Internet整体结构 6 1.2 网络分层模型和TCP/IP协议 7 1.2.1 OSI 模型 7 1.2.2 TCP/IP协议 12 1.3 网络进程通信原理 22 第二章 Socket套接字 24 2.1 Berkeley Sockets 24 2.1.1 理解berkeley sockets接口 24 2.1.2 使Socket模型 26 2.2 Windows sockets 33 2.2.1 理解windows sockets 33 2.2.2 winsock 编程模型 35 2.2.3 berkeley sockets和windows sokets比较 38 2.3 Winsock编程实例 41 2.3.1 主机地址查询程序 41 2.3.2 一个简单的FTP程序 43 2.3.3 小结 48 第三章 Visual C++6.0编程基础 49 3.1 Visual C++6.0编程工具简介 49 3.2 面向对象语言C++ 51 3.3 ViualC++6.0的使 52 3.4 MFC编程概述 57 第四章 Casync Socket类和CSocket类 60 4.1 Casync Socket类 60 4.2 Csocket类 61 第五章 Winsock库函数参考 66 5.1 Windows Socket 1.1 库函数参考 66 5.2 数据库函数 72 5.3 Windows扩展函数 74 5.4 Windows Socket 2.0 扩展库函数参考 79 第六章 Sockets, MAPI和Internet 89 6.1 消息API(MAPI) 92 6.1.1 什么是MAPI? 92 6.1.2 扩展MAPI 96 6.2 OLE 消息 97 6.3 使Internet Server(ISAPI)类 98 第七章 使WinInet类库的网络开发 102 7.1 设计Interent查询 102 7.2 查询HTTP节点 111 7.3 查询FTP节点 115 7.4 查询Gopher节点 117 7.5 使Gopher去发送Finger查询 119 7.6 使Gopher去发送Whois查询 121 7.7 将来的工作 123 第八章 例子程序代码分析 125 8.1 MAPI创建邮件应程序 125 8.1.1 消息应接口(MAPI) 125 8.1.2 两种比较高级的选择:简单MAPI和CMC 125 8.2 连接FTP 133 8.2.1 Ftp连接类的信息 134 8.2.2 创建应程序 138 8.2.3 检索FTP文件服务器 140 8.2.4 向服务器发送文件 142 8.2.5 获得FTP服务器根目录 147 第九章 HTML、CGI与ISAPI 153 9.1 HTML简介 153 9.2 VBScript 157 9.3 CGI 163 9.3.1 为什么使CGI? 163 9.3.2 CGI是什么? 163 9.3.3 选择你熟悉的编程语言 163 9.3.4 安全 164 9.4 ISAPI 165 第十章 ActiveX容器应程序 173 10.1 向对话框中添加ActiveX控件 173 10.2 示例程序MyPlayer 175 10.3 源程序清单 179 第十一章 编写ActiveX控件 195 11.1 ActiveX Control Wizard 195 11.2 添加属性 200 11.3 添加方法 205 11.4 添加事件 207 11.5 ActiveX Control Test Container 210 11.6 在Internet上使ActiveX控件 212 11.7 源代码清单 215 第十二章 ActiveX自动化客户 228 12.1 自动化基础 228 12.2 创建初始应程序 231 12.3 类型库和COleDispatchDriver 233 12.4 创建和使自动化对象 236 12.5 部分源程序清单 240 第十三章 ActiveX自动化服务器 263 13.1 自动化服务器基础 263 13.2 创建自动化服务器框架工程 264 13.3 添加属性和方法 268 13.4 完成示例程序AutoDirInfo 270 13.5 支持双接口 275 13.6 在Internet上使自动化对象 282 13.7 源程序清单 284
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值