博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
手动调动编译器、链接器编程
阅读量:4124 次
发布时间:2019-05-25

本文共 3031 字,大约阅读时间需要 10 分钟。

       在不同的操作系统和编译器系统中,运行C++编译器的命令也不同。最常用的编译器是GUN编译器和微软Visual Studio编译器。

       运行GUN编译器的命令是g++:$  g++  -o   prog1  prog1.cc ,其中$是系统提示符,-o  prog1是编译器参数,指定可执行文件的文件名。(在UNIX系统中,可执行文件没有后缀,在Windows系统中可执行文件的后缀是.exe)

       运行微软Visual Studio编译器的命令是cl:c : \user\me\Programs>  cl  /EHsc  prog1.cpp ,其中c : \user\me\Programs>是命令提示符,\user\me\Programs是当前文件夹。命令cl调用编译器,/EHsc是编译器选项,用来打开标准异常处理。

       编辑器、编译器和链接器是使用C语言进行开发所需要的三个最基本的工具,而且也是最小的工具集,缺一不可。

1.编辑器

       编辑器的作用就是将我们在键盘上的敲击转换成写有代码的文件——容器,这个文件被称为源文件。
       这个编辑器在形式上很像是一个记事本程序,可以在上面添加、删除、插入字母或者文字。记事本可以作为C语言编辑器。这些代码保存到一个文件中,供下次编辑或者直接交给编译器去处理,这个文件就是源文件。
       不过,记事本可以算是最简单和最不专业的C语言编辑器了!一般而言,专业的C语言编辑器都有其他方便C语言代码编辑的功能。例如,最基本的语法高亮功能。越高级、越专业的C语言编辑器,越能最大程度地方便你写C语言代码。比如NotePad++。
       其实,只要能将键盘的输入转换成源文件的就可以称为编辑器。一般的编辑器也是可以编写C语言代码的,只不过比起专业的C语言编辑器会显得难用和不舒服一点。
2.编译器
       编译器的作用是将保存着代码的源文件,转换成一种称为目标文件的二进制文件。源文件是我们能看懂的,是给我们用的。而二进制文件是计算机能看懂的文件,是给计算机用的。计算机根据二进制文件中的内容决定该做什么事情,不该做什么事情。
       在这个转换过程中,编译器先对源文件中的内容进行扫描,根据C语言的语法要求,逐个检查源文件中出现的每一个字母或者文字。
       如果这些文字符合C语言的语法要求,那么它就根据这些字母和文字的含义将其转换成计算机可以识别的二进制代码,并将其按照一定的格式保存在二进制文件中。如果某些地方的字母或者文字不符合C语言的语法要求,那么编译器将报告所有不符合的地方,不再生成二进制文件,只有改正所有不符合语法要求的地方,让编译器重新对改正的源文件进行转化,才可以生成二进制文件。
       编译器对源文件的转换过程在计算机中有个专业的名字,叫"编译"。编译器也因此得名,表示编译的工具。
3.链接器
       一般所写的程序最终是要运行在某个操作系统上的。因此,即使是一个很简单的程序也需要操作系统来处理很多事情,才能使程序正常运行。操作系统往往会提供一些被称为开发库的二进制文件,编译器产生的目标二进制文件只有和这些库二进制文件结合才能生成一个可执行程序,才能使我们写的程序正常地运行于某个操作系统之上。
       链接器所做的工作就是将所有的二进制文件链接起来融合成一个可执行程序,不管这些二进制文件是目标二进制文件还是库二进制文件。链接器将二进制文件融合的这一过程,在计算机中也有一个专业的名字--"链接",链接器也因此得名,表示链接的工具。

实战演练:

       1、首先命令行窗口(cmd)进入编译器、链接器所在文件夹(在你的VS2013安装目录下搜索cl.exe)。cd命令不会修改当前drive,当输入cd d:时先是出现了d:/,后来在下一行又自动转调到了初始的目录。解决办法:在命令提示符的DOS窗口下直接输入d:。回车后就可以直接转跳到D盘符下了。(下面还有一种VS2013提供的更简洁的方法)

       

      2、在上述文件夹新建“prog1.cpp”文件,用记事本打开并编辑。如下图:

       3、接下来看一下集成开发环境中使用的编译器和链接器。其中,画圈的两个就是编译器和链接器,"cl.exe"是编译器,"cl"表示"compiler"中的两个字母,表示编译,它将程序源代码文件编译为obj文件;"link.exe"就是链接器,"link"就是链接的意思,link.exe是Windows平台的链接器,它将cl.exe编译生成的obj文件,资源编译器(rc.exe)生成的.res文件,以及lib目录下的lib文件等链接成可执行的exe文件、dll文件等。link.exe是将对象文件和库链接起来以创建可执行程序文件或动态链接库文件的工具。link.exe的输入文件包括obj文件、lib文件、exp文件、def文件、res文件、txt文件、ilk文件。输出文件是exe文件、dll文件、sys文件等可执行程序文件。。

4、CL 调用链接器(https://msdn.microsoft.com/zh-cn/library/btw8x58e.aspx)

编译prog1.cpp,出现错误:

解决办法来自:http://blog.csdn.net/zhouyang209117/article/details/17737413

https://msdn.microsoft.com/en-us/library/ms235639.aspx(上介绍cl的使用方法是”开始“-”所有程序“-"Visual Studio 2013"-"Visual Studio Tools"再以管理员身份运行”VS2013开发人员命令提示”)(这种方法也是需要设置环境变量的)

https://msdn.microsoft.com/en-us/library/ff381409(v=vs.85).aspx

按照上述方法设置各种环境变量之后:

进入生成的prog1.exe,显示程序打印结果:

更复杂的示例(摘自官方):

假设您正在编译三个 C 源文件:MAIN.c、MOD1.c 和 MOD2.c。 每个文件包括对在另外不同文件中定义的函数的调用:
        MAIN.c 调用 MOD1.c 中的函数 func1 和 MOD2.c 中的函数 func2。
        MOD1.c 调用标准库函数 printf_s 和 scanf_s。
        MOD2.c 调用名为 myline 和 mycircle 的图形函数,这些函数是在名为 MYGRAPH.lib 的库中定义的。
要生成此程序,使用下列命令行进行编译:
        CL  MAIN.c  MOD1.C  MOD2.C  MYGRAPH.lib
CL 先编译 C 源文件,然后创建对象文件 MAIN.obj、MOD1.obj 和 MOD2.obj。 编译器将标准库的名称放在每个 .obj 文件中。
CL 将 .obj 文件的名称和名称 MYGRAPH.lib 一起传递给链接器。 链接器解析外部引用,如下所示:
     在 MAIN.obj 中,使用 MOD1.obj 中的定义解析对 func1 的引用;使用 MOD2.obj 中的定义解析对 func2 的引用。
     在 MOD1.obj 中,使用链接器找到的、在 MOD1.obj 内命名的库中的定义解析对 printf_s 和 scanf_s 的引用。
     在 MOD2.obj 中,使用 MYGRAPH.lib 中的定义解析对 myline 和 mycircle 的引用。

你可能感兴趣的文章
qml有关矩形说明
查看>>
在qt中使用QSplitter设置初始比例setStretchFactor失效的解决方法
查看>>
repeater的使用
查看>>
qt msvc编译中文乱码解决
查看>>
qt中TextField输入框无法输入中文解决办法
查看>>
qt实现点击出现窗口,点击其他任何地方窗口消失
查看>>
QML DropArea拖拉文件事件
查看>>
CORBA links
查看>>
读后感:>
查看>>
ideas about sharing software
查看>>
different aspects for software
查看>>
To do list
查看>>
Study of Source code
查看>>
如何使用BBC英语学习频道
查看>>
JDBC and JTP Transaction
查看>>
spring事务探索
查看>>
浅谈Spring声明式事务管理ThreadLocal和JDKProxy
查看>>
关于NP问题与P问题的认识
查看>>
数据通信之必会概念总结
查看>>
拉格朗日条件优化
查看>>