【VC++开源代码栏目提醒】:以下是网学会员为您推荐的VC++开源代码-C 代码编译过程与方法 - 互联网,希望本篇文章对您学习有所帮助。
C
代码编译过程与方法 Visual C是微软公司推出的新一代程序开发语言Visual C是微软公司.Net FrameWork框架中的一个重要的组成部分也是微软公司向程序员极力推荐一个新的程序开发平台。
和以往的开发语言相比较他有更强大功能更高的稳定性和更高的安全性。
也正因为如此Visual C正在受到越来越多的编程爱好者的欢迎。
Visual C的编译器和以往编程语言的编译器有着明显的不同。
其最大的不同点就是以往的程序编译器是把编写好的程序
代码编译生成可以直接为计算机所使用的机器语言。
虽然Visual C的编译器也可以把编写好的程序
代码编译成EXE或者是DLL文件但这种文件只是一种IL文件中间语言此IL文件不能直接被计算机使用。
只是当此IL文件被调用的时候再通过一种名叫JIT即时编译编译器把此IL文件生成可以供计算机使用的机器
代码。
可见Visual C的编译过程大致可以分成二个部分第一个部分从程序
代码到IL文件这个过程是通过人工干预来实现的即通过CSC.exe来实现的第二个部分从IL文件到机器语言这个工程是机器自动实现的。
本文就将具体来说明一下第一个部分即如何用CSC.exe来正确编译Visual C文件。
CSC.exe把Visual C程序
代码编译成IL文件时有着很多参数和开关选项。
正确的了解和运用这些参数和开关有时会解决一些看似很棘手的问题。
下面就通过一张表来大致说明一下这些参数和开关的具体作用。
这些参数和开关选项是按照字母顺序来排列的。
其中带是一些常用的参数或开关。
/win32res插入一个Win32资源导输出文件中 具体说明 一. 这个选项是用来指定响应文件。
响应文件是一种包含了许多编译选项的文件。
这些编译选项将和源
代码文件一起由编译器进行处理。
一般来说此种响应文件是以文本文件形式出现。
他的扩展名是.rsp。
在响应文件中是用符号表示开始的注释。
例以下是一个响应文件resp1.rsp的内容 这是一个简单的响应文件文件名称为resp1.rsp 使用方法cscresp1.rsp /targetexe/outsample.exe sample.cs 此响应文件的作用就是把sample.cs文件编译成sample.exe文件。
如果在一次编译中要指定多个响应文件可以指定多个响应文件选项如 file1.rspfile2.rsp 二./和/help 这个选项应该不必多说那些用过DOS程序的人大概都会用这个选项。
三./addmodule 本选项是使编译器搜集从用户正在编译的工程到可用文件中所以类型的信息。
所有添加了/addmodule的模块在运行时必须与输出文件在同一目录中。
这就是说用户可以在编译时指定任何目录中的模块但在运行时这个模块必须在应用程序目录中。
文件中不能包含汇编名单。
例如如果输出文件用/taargetmodule创建其元数据可以用/addmodule导入。
例子把二个模块加入myProject.cs中 csc/addmodulemodule1.dllmodule2.dll myProject.cs 四./baseaddress 本选项允许用户指定载入DLL时的首选地址这个首选地址可以是十进制、十六进制、八进制。
DLL的缺省首选地址在.Net运行时设置。
如果目标文件不是DLL文件这个选项将被忽略。
例子把myLibrary.cs编译程DLL文件并且当此DLL在.Net运行环境被载入时的地址是0x 1111000 csc/baseaddres0x 1111000/targetlibrary myLibrary.cs 五./bugreport 这个选项用来报告编译时的错误信息。
在报告中包含以下内容 1.编译中所有源
代码的一个拷贝 2.在编译中所有的编译选项 3.编译信息包括编译器、运行时间、操作系统的版本信息 4.编译器输出 5.问题的描述 6.如何解决问题的描述 例子生成一个bugs.txt文件并把错误报告放在文件里面 csc/bugreportbugs.txt Hello.cs 六./checked 此选项指定不在检验或或者未检验关键字范围内以及导致超出数据类型范围的值的整数计算语句是否产生运行例外。
具体的说就是如果不在检验或者未检验关键字范围内的整数计算语句产生的值在数据类型允许的范围之外并且在编译中使用了/checked/checked该语句就会在运行时产生例外如果在编译时使用了/checked-在运行时该语句就不会产生例外。
例子编译myMath.cs并且指定一个不在检验或者未检验关键字范围内的整数计算语句且其产生的值超出数据类型的范围将在运行时引起例外。
csc/checkedmyMath.cs 七./codepage 如果用户编译的一个或者多个源
代码不使用计算机上的默认
代码页可以使用/codepage选项来指定希望使用的
代码页。
/codepage适用于编译中所有的源
代码文件。
如果源
代码文件在计算机上的同一个
代码页位置创建或者源
代码文件用UNICODE或者UTF-8来创建用户就不需要使用/codepage了。
八./debug 此选项是在调试时候使用的当调试者启用了这个选项来调试自己的程序将会创建一个.pdb文件并把各种调试信息写到此文件里。
有2中选项来指定调试的类型 /debug/-当选用/debug就会把创建.pdb文件并把调试信息存储到里面/debug-是一个缺省设置就是不产生任何调试信息。
/debugfull/pdbonly当使用/debugfull就是创建缺省的调试信息有点类似/debug选项。
/debugpdbonly选项是创建.pdb文件并且你只能使用源
代码调试在调试工具里。
例子编译Hello.cs并且为Hello.cs创建调试信息 csc/debugHelloWorld.cs 九./define 此选项在程序中定义了一个符号他和在源程序中使用define预处理程序指示功能相同此符号保持已定义状态直到源文件中的undef指示符删除定义或者编译器已到达了文件末尾。
你可以用/d简写来代替。
例子下面是my.cs的源程序 如果用csc/definefinal my.cs来编译就会显示Final Build如果没有/define编译后执行就会显示Trial Build。
十./doc 例子以下是my.cs的源程序 public class myDocument 用下列编译语句会产生my.xml文件看看my.xml文件到底存储了什么东西。
Csc/docmy.xml my.cs 十一./fullpaths 在默认情况下编译产生的错误或者警告都只会指明发现错误的文件名称加入此选项使得在编译器产生错误或者警告的时候会显示完整的路径。
你可以把上面的my.cs程序语法搞错再用csc/fullpaths my.cs和csc my.cs分别编译看看错误提示有什么不同。
十二./incremental 本选项主要是激活增量编译器这种编译器只对上次编译后发生改变的函数进行编译。
如果在编译时候选用了/debug选项调试信息的状态存储在相应的.pdb文件中。
除此编译时的信息都存储在.incr文件中此.incr文件的名称为output_file_name.extension.incr。
即如果输出文件时out.exe则此文件对应的incr文件是out.exe.incr文件。
例子利用增量编译器来编译文件 csc/incremental/outmy.exe my.cs 如果编译成功则会产生2个文件分别是my.exe和my.exe.incr。
十三./linkresource 这个选项就是在输出文件中创建到.Net资源的链接。
他的简写是/linkres。
资源文件就是在那些在工程文件中使用到的所有的资源像图片、声音等。
这个选项只是对于资源文件建立链接这样有助于管理使用同一资源的程序而不需要多个副本。
此选项的具体语法如下 /linkresourcefilenameidentifiermimetype 其中 filename是想建立链接的.Net的资源文件 identifier可选资源的逻辑名称该名称用于载入资源默认名称是文件名称。
mimetype可选是一个代表资源的媒介类型的字符串。
默认为空。
例子在文件中建立一个指向reso.resource的链接 csc/linkresreso.resource myResource.cs 十四./main 当我们编译二个或者多个拥有Main方法的Class我们可以使用这个选项让用户指定最终的输出文件中的使用那个Main的方法。
例子编译二个文件但输出文件中的Main方法来自Main1 Class csc myMain1.cs myMain2.cs/mainMain1 十五./nologo 这个选项禁止在编译器启动时显示开始标志和编译过程中显示报告信息。
例子 csc/nologo my.cs 十六./nooutput 编译文件但不创建任何输出文件。
用户可以看到任何编译错误和警告。
例子 csc/nooutput my.cs 十七./nostdlib 这个选项禁止导入mscorlib.dll。
这个DLL包含了这个系统名称空间。
当用户希望使用自己的系统名称空间时一般才会使用此选项。
例子编译文件但不导入mscorlib.dl csc/nooutput myOutput.cs 十八./nowarn 例子在编译过程中禁止警告类型CS0108和CS0109 csc/nowarn108109 Warn.cs 十九./optimize 本选项激活或者禁用由编译器执行优化。
优化的结果是使得输出文件更小、更快、更有效率。
缺省是/optimize执行优化如果你选用了/optimize-则禁止优化。
/o是/optimize的简写。
例子编译文件并禁止优化 csc/optimise-my.cs 二十./out 在没有指定输出文件的情况下如果通过编译器编译后文件是EXE文件则输出文件将从包含Main方法的源
代码的文件中获得名字如果编译后的文件是DLL文件将从第一个源
代码文件中获得名字。
如果用户想要指定输出文件名称就可以使用此选项。
例子编译HelloWord.cs文件并把输出文件命名为Hello.exe csc/outHello.exe helloworld.cs 二十一./recurse 此选项允许用户编译在指定目录或者工程目录的所以子目录中的所有源
代码文件。
用户可以使用通配符来编译工程目录下的所有匹配文件。
例子编译/dir1/dir2目录下及其下级目录中的所有C文件并生成dir2.dll csc/targetlibrary/outdir2.dll/recursedir1dir2.cs 二十二./refrence 此选项可使得当前编译工程使用指定文件中的公共类型信息。
这个选项对于初学者是很重要的。
此选项的简写是/r。
你必须引用在程序
代码中使用using关键字导入的所有文件如果在你的程序中使用了自己编写的类库在编译时也必须引用。
例子编译文件并引用在程序中使用的文件 csc/rsystem.dllmyExec.exemyLibrary.dll myProject.cs 注其中那个myExec.exe和myLibrary.dll时自己创建的 二十三./target 这个选项是告诉编译器你所想得到什么类型的输出文件。
除非使用/targetmodule选项其他选项创建的输出文件都包含着汇编名单。
汇编名单存储着编译中所有文件的信息。
在一个命令行中如果生成多个输出文件但只创建一个汇编名单并存储在第一个输出文件中。
下面是/target的4种用法 /targetexe创建一个可执行EXE的控制台应用程序 /targetlibrary创建一个
代码库DLL /targetwinexe创建一个windows程序EXE /targetmodule创建一个模块DLL 例子 csc/targetexe myProj.cs//创建一个EXE文件 csc/targetwinexe myProject.cs file//创建一个windows程序 csc/targetlibrary myProject.cs file//创建一个
代码库 csc/targetmodule myProject.cs file//创建一个模块 二十四./resource 此选项和/linkresource正好相反。
他的作用是把.Net资源文件嵌入到输出文件中参数、用法都和/linkresource也相同具体可参考前面/linkresource选项。
二十五./unsafe 此选项是告诉编译器采用非安全模式编译文件 例子用非安全模式编译my.cs csc/unsafe my.cs 二十六./warn 使用本选项是在编译过程中采用什么等级的警告级别 4级别为3的警告和信息警告 例子编译文件不显示任何错误 csc/warn0 my.cs 二十七./warnaserror 告诉编译器把在编译中把所有的警告当成错误来处理。
/warnaserror-是缺省选项在该选项下编译中的警告不影响文件的输出。
/warnaserror和/warnaserror是一样的。
例子编译文件并在编译中把警告当成错误 csc/warnaserror myj.cs 二十八./win32icon 在输出文件中插入一个图标文件.ico。
从而在Windows中的资源管理器中就看到以此图标标识的文件了。
例子 csc/win32iconmyicon.ico my.cs 二十九./win32res 例子添加一个win32资源文件到输出文件中 csc/win32reswinrf.res mt.cs 如果没有VS用下面的办法搜索csc.exe打开cmd转到csc.exe的文件夹运行csc/tlibrary NNETcs.cs NNETcs.cs是你的cs文件的位置正常情况下csc.exe的目录下会多个dll文件copy出来 asp.net程序是经过编译执行的这个大家都知道尤其是使用Codebehind的时候必须先把背后的.cs文件编译形成.dll文件然后才可以执行。
这个过程如果你有vs.net那很轻松就可以完成但如果没有那就得借助命令行了。
仔细查一下.net framework sdk文档可以找到关于这个话题的详细说明好象没有必要专门贴一篇文章但是今下午我在用的时候却发现了一个问题文档中说运行VCVARS32.BAT但当你进入.net framework sdk的安装目录的bin文件夹下却并没有发现VCVARS32.BAT文件这个时候只能使用sdkvars.bat文件了其实这个的作用应该是和那个传说中的VCVARS32.BAT相同。
当你运行了sdkvars后就可以使用先前被封印的csc命令了。
然后就可以用csc命令编译.cs文件了这个时候可能又会出现一个问题按照大部分书上的说法你只要指定了Inherits和Codebehind并且用csc编译了那个背后的.cs就可以运行这个aspx文件但实际上并不是这样错误提示为找不到指定的类。
解决办法就是在根目录下建立一个bin文件夹然后把编译产生的.dll文件放到里面去这样问题应该就解决了。
如果还是找不到那问题可能是你的bin文件夹并不是在根目录最上面而是在根目录下的某个文件夹里这个时候你需要做的就是把它拖到最上面。
下面给出命令行示例这个其实在.net framework sdk文档里就可以找到不过为了方便还是复制了过来编译File.cs以产生File.execsc File.cs编译File.cs以产生File.dllcsc/targetlibrary File.cs编译File.cs并创建My.execsc/outMy.exe File.cs通过使用优化和定义DEBUG符号编译当前目录中所有的C文件。
输出为File2.execsc/defineDEBUG/optimize/outFile2.exe.cs编译当前目录中所有的C文件以产生File2.dll的调试版本。
不显示任何徽标和警告csc/targetlibrary/outFile2.dll/warn0/nologo/debug.cs将当前目录中所有的C文件编译为Something.xyz一个DLLcsc/targetlibrary/outSomething.xyz.cs编译File.cs以产生File.dllcsc/targetlibrary File.cs这个就是我们使用最多的一个命令其实可以简单的写成csc/tlibrary File.cs另外的一个写法是csc/outmycodebehind.dll/tlibrary mycodebehind.cs这个可以自己指定输出的文件名。
csc/outmycodebehind.dll/tlibrary mycodebehind.cs mycodebehind2.cs这个的作用是把两个cs文件装到一个.dll文件里很有用哦。
csc.exe是.net用来编译.cs文件的但必须要在安装目录下使用。
所以我们要设置一下环境变量。