Linux系统中C和C++程序的编译与链接

2021-04-21 09:28

阅读:642

标签:源文件   支持   语言   好处   code   linux发行版   linux系统   inf   文件夹   

  在Windows操作系统中,如果我们想要开发C程序或者C++程序,我们通常都会在集成开发环境(IDE, integrated development envirnoments)上面进行工作,由于这些IDE大多都使用图形用户界面(GUI,graphic user interface),因此在IDE上由C和C++源代码生成可执行文件是一件非常方便的事。

  虽然现在很多Linux发行版比如(Ubuntu)也支持安装很多很方便的IDE,使用命令行进行编译还是有很多好处的,尤其是当你需要编译大批的源文件的时候命令行能为你节省很多时间。下面我们将介绍在Linux操作系统中用命令行以及makefile进行编译链接的问题,我们选择的C编译器和C++编译器分别是gcc和g++,在任何Linux的发行版中,这两个编译器都能很方便地获取到。为了叙述上的方便,我们以C++程序为例,C程序的编译和链接跟C++程序大体上是相同的。

  为了完成一个C++程序,首先我们需要用一个文档编辑器来编辑我们的源代码,这里我们用vim编辑器来做这件事。

  首先,在终端上键入vim cprogram.cpp ,这里要注意的是这个后缀名,虽然在Linux系统对后缀名并没有严格的要求,但是如果要让g++识别出这是一个C++源文件的话,后缀名必须是c,cc,cxx,cpp,c++这几种。比如说如果我们想要g++去编译一个.txt后缀的文件的话,它就会输出异常的信息。

技术图片

 

   进入vim之后,我们先键入 i 进入 insert 模式,然后再输入如下的源代码:

技术图片

 

   然后再在终端上键入g++ cprogram.cpp -o cprogram。 这个命令的意思让g++编译源文件cprogram.cpp,然后将编译的结果输出到 crpogram 中,这样cprogram就成为了一个可执行文件。为了验证cprogram是一个可执行文件,我们只需要用 ls -l 命令输出它的权限:

技术图片 

  为了执行cprogram,我们只需要在终端上键入 ./cprogram ,这是因为cprogram作为一个程序并不在 $PATH 变量保存的路径里面,所以我们需要指明它所在的位置(注意到由于我们一直没有离开当前工作的文件夹,所以我们用的是 ./ 相对路径,如果通过 cd 切换了工作文件夹,我们需要指明 cprogram 的绝对路径。

  我们可以看到cprogram输出了我们期望的 Hello Linux。

技术图片

   在一个典型的C++程序的生成过程中,源文件经过编译之后并不是直接就生成了一个可执行文件。就像在我们上面的例子中,我们为了在屏幕上输出 Hello Linux 我们调用了 std::cout 函数,但是问题是在我们的源文件中并没有实现 cout 函数,那么这个关于 cout 函数的代码是怎么添加到我们的最终的程序里面去的呢。这是因为在C++程序的生成过程中,编译只是将我们的C++源代码转换成了机器语言,此时会在生成一个以 .o 为后缀名的文件(在我们上面的例子中,就是 cprogram.o),通常将它称为目标代码(object code),要将目标代码转换成可执行文件,我们还需要经过一个叫做链接的过程。

  比如说在我们上面的例子中,我们 #include 头文件并且使用了其中的 std::cout 函数,我们需要了解的是这个头文件仅仅包含了我们下面需要使用的 std::cout 函数的声明,并没有包含它的实现,它的实现放在了 iostream 库里面。在我们链接的过程中,编译器就会到 iostream 库里去寻找包含 std::cout 的目标文件。然后把这个目标文件跟我们的 cprogram.o 链接起来就形成了我们最终的可执行文件。  

  上面的讨论启发我们可以实现自己的一个链接过程。

  首先我们编辑一个我们自己的头文件 print.h :

技术图片

 

   然后再写一个只包含头文件中声明的函数 print() 的源文件 cprogram2.cpp ,注意在它的源文件中也要 #include"print.h" 。为什么这里有引号而不用尖括号呢?因为当编译器遇到用尖括号包含的头文件时,只会到存放标准库头文件的文件夹里面去寻找这个头文件。而如果遇到用引号包含的头文件会先在当前文件夹寻找,然后再去标准库头文件的文件夹。而我们这里是把这个头文件放在当前文件夹的,需要用引号把它括起来。编写好的 cprogram2.cpp 如下面图:

技术图片

 

   然后再回到我们原来的 cprogram.cpp ,对它做一些改动:

技术图片

 

   为了得到 cprogram.cpp 和 cprogram2.cpp 的目标文件,我们只需要键入命令 g++ -c cprogram.cpp cprogram2.cpp 即可(-c 是 gcc 程序的可选项,即 complie, 编译),通过 ls 命令我们可以看到当前目录下已经生成了 cprogram.o 和 cprogram2.o 两个目标文件。然后输入命令 g++ cprogram.o cprogram2.o -o cprogram 链接这两个目标文件生成最后的可执行文件 cprogram 。  

 

Linux系统中C和C++程序的编译与链接

标签:源文件   支持   语言   好处   code   linux发行版   linux系统   inf   文件夹   

原文地址:https://www.cnblogs.com/khrushchev/p/13281424.html


评论


亲,登录后才可以留言!