用gcc进行程序的编译
在Linux系统上,一个档案能不能被执行看的是有没有可执行的那个权限(x),不过,Linux系统上真正认识的可执行文件其实是二进制文件(binary program),例如/usr/bin/passwd 这些档案就是二进制程序代码。
怎么产生一个可执行的二进制程序呢?首先写程序,用字处理器写完的程序即源代码,这个源代码就是一般的纯文本文档。在完成源代码的编写后,再来就是将程序代码编译成操作系统看得懂的binary program。编译需要编译程序来动作,经过编译程序的编译与连结之后,就可以产生一个可执行的二进制程序。举例来说,Linux上最标准的程序语言是c,我们用c来写源代码,用Linux上标准的c语言编译程序gcc来编译,然后生成可执行的binary program。
有时候我们会在程序中引用其他外部子程序,或者利用其他软件提供的函数功能,我们就必须在编译的过程中,将函式库加进去,这样,编译程序可以将所有的程序代码与函式库作一个连结(Link)以产生正确的执行档(可执行binary program档案)。
- make和configure
- Tarball
Tarball档案,其实就是将软件所有的原始代码档案先以tar打包,然后再以压缩技术来压缩,最常见的是gzip,所以tarball档案的扩展名是*.tar.gz或者*tgz。由于bzip2的压缩效率更佳,因此裆名也会变成*.tar.bz2。
- 打印hello world
(1)直接以gcc编译原始码
[root@localhost]# vi hello.c
[root@localhost Documents]# cat hello.c
#include <stdio.h>
int main(void){
printf("Hello World\n");
}
[root@localhost]# gcc hello.c
[root@localhost]# ll
total
-rwxr-xr-x. root root Jun : a.out #编译成功的可执行binary program
-rw-r--r--. root root Jun : hello.c
[root@localhost]# ./a.out #执行文档
Hello World
(2)产生目标文件来进行其他动作,而且执行的档名也不用预设的a.out
[root@localhost]# gcc -c hello.c
[root@localhost]# ll hello*
-rw-r--r--. root root Jun : hello.c
-rw-r--r--. root root Jun : hello.o #产生的目标文件
[root@localhost]# gcc -o hello hello.o
[root@localhost]# ll
total
-rwxr-xr-x. root root Jun : hello #可执行文件
-rw-r--r--. root root Jun : hello.c
-rw-r--r--. root root Jun : hello.o
[root@localhost Documents]# ./hello
Hello World
(3)子程序的编译
[root@localhost]# vi thanks.c
[root@localhost]# cat thanks.c
#include <stdio.h>
int main(void)
{
printf("Hello World\n");
thanks_2(); #子程序
}
[root@localhost]# vi thanks_2.c
[root@localhost]# cat thanks_2.c
#include <stdio.h>
void thanks_2(void)
{
printf("Thank you!\n");
}
[root@localhost]# ll thanks*
-rw-r--r--. root root Jun : thanks_2.c
-rw-r--r--. root root Jun : thanks.c
[root@localhost]# gcc -c thanks.c thanks_2.c
[root@localhost]# ll thanks*
-rw-r--r--. root root Jun : thanks_2.c
-rw-r--r--. root root Jun : thanks_2.o
-rw-r--r--. root root Jun : thanks.c
-rw-r--r--. root root Jun : thanks.o
[root@localhost]# gcc -o thanks thanks.o thanks_2.o
[root@localhost]# ll thanks*
-rwxr-xr-x. root root Jun : thanks
-rw-r--r--. root root Jun : thanks_2.c
-rw-r--r--. root root Jun : thanks_2.o
-rw-r--r--. root root Jun : thanks.c
-rw-r--r--. root root Jun : thanks.o
[root@localhost]# ./thanks
Hello World
Thank you!
(4)此外
[root@localhost]#gcc -O hello.c -c #会自动产生hello.o,并且进行优化
[root@localhost]#gcc -o hello hello.c -Wall #加入-Wall,程序的编译会变的较为严谨,警告信息会显示出来
用gcc进行程序的编译的更多相关文章
- 【嵌入式开发】gcc 学习笔记(一) - 编译C程序 及 编译过程
一. C程序编译过程 编译过程简介 : C语言的源文件 编译成 可执行文件需要四个步骤, 预处理 (Preprocessing) 扩展宏, 编译 (compilation) 得到汇编语言, 汇编 (a ...
- gcc 学习笔记(一) - 编译C程序 及 编译过程
一. C程序编译过程 编译过程简介 : C语言的源文件 编译成 可执行文件需要四个步骤, 预处理 (Preprocessing) 扩展宏, 编译 (compilation) 得到汇编语言, 汇编 (a ...
- 关于一个程序的编译过程 zkjg面试
http://blog.csdn.net/gengyichao/article/details/6544266 一 以下是C程序一般的编译过程: 从图中看到: 将编写的一个c程序(源代码 )转换成可以 ...
- GCC 4.8.2 编译安装
https://my.oschina.net/u/728245/blog/184550 摘要: GCC 4.8.2 在 CentOS 6.5 下编译安装小记,遇到一些问题并解决. 以前从没有升级过 ...
- 附录三 嵌入式C程序的编译与调试
课程回顾 C语言库的特性和发展 C语言库的常用库函数 标准库函数的特色应用 git@github.com:Kevin-Dfg/Data-Structures-and-Algorithm-Analysi ...
- Linux C程序的编译过程
Linux C程序的编译过程 学习一门语言程序,本人觉得还是得学习它的编译规则,现在,通过小例子小结下自己对C编译的认识. /*test.c 了解C程序的编译*/ #include <s ...
- gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解
摘自http://blog.csdn.net/elfprincexu/article/details/45043971 gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解 C和C+ ...
- Linux - gcc 的简易用法 (编译、参数与链结)
# 仅将原始码编译成为目标档,并不制作连结等功能: [root@www ~]# gcc -c hello.c # 会自动的产生 hello.o 这个文件,但是并不会产生 binary 运行档. # 在 ...
- gcc/g++ 实战之编译的四个过程
gcc和g++分别是GNU(一个开源组织)的c&c++编译器 对于.c后缀的文件,gcc把它当做是C程序,g++当做是C++程序:对于.cpp后缀的文件,gcc和g++都会当做c++程序. ...
随机推荐
- Fedora 24中的日志管理
Introduction Log files are files that contain messages about the system, including the kernel, servi ...
- Chrome插件(Extensions)开发攻略
本文将从个人经验出发,讲述为什么需要Chrome插件,如何开发,如何调试,到哪里找资料,会遇到怎样的问题以及如何解决等,同时给出一个个人认为的比较典型的例子——获取网页内容,和服务器交互,再把信息反馈 ...
- ABP框架 - 领域事件(EventBus)
文档目录 本节内容: EventBus 注入 IEventBus 获取默认实例 定义事件 预定义事件 处理完异常 实体修改 触发事件 处理事件 处理基类事件 处理程序异常 处理多个事件 处理程序注册 ...
- 【PRINCE2是什么】PRINCE2认证之七大原则(5)
我们先来回顾一下,PRINCE2七大原则分别是持续的业务验证,经验学习,角色与责任,按阶段管理,例外管理,关注产品,剪裁. 第五个原则:例外管理. PRINCE2对每个项目目标都定义了容许偏差来建立授 ...
- AngularJs之四
一,数据循环:特别要注意作用域 使用ng-repeat指令. <div ng-app="myApp" ng-controller="myCtrl"> ...
- SQL Server 多实例下的复制
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 搭建步骤(Procedure) 注意事项(Attention) 二.背景(Contexts) ...
- 理清JavaScript正则表达式--上篇
在JavaScript中,正则表达式由RegExp对象表示.RegExp对象呢,又可以通过直接量和构造函数RegExp两种方式创建,分别如下: //直接量 var re = /pattern/[g | ...
- NET Core-学习笔记(二)
这里要分享的是接着上篇:NET Core-学习笔记(一)展开的继续学习core笔记,有不妥之处或者更好见解的地方希望各位朋友多多分享. 下面是本篇将要分享的学习步奏,对于刚学或者即将要学习的朋友做个相 ...
- Elinq+Oracle
这份工作一直以来都用Oracle数据库,先前都是直接用的ADO.NET但是写包跟存储过程是一个很头疼的事情,满足不了快速开发的需求. 一直常识找比较好用的ORM,先前用的Entity Framewor ...
- 设计模式(三):“花瓶+鲜花”中的装饰者模式(Decorator Pattern)
在前两篇博客中详细的介绍了"策略模式"和“观察者模式”,今天我们就通过花瓶与鲜花的例子来类比一下“装饰模式”(Decorator Pattern).在“装饰模式”中很好的提现了开放 ...