第一课 GCC入门

1序言

  gcc是一个可移植的编译器,支持多种硬件平台;也不仅仅是一个本地编译器也是一个跨平台编译器;支持多张语言编译时按照模块化设计支持多种语言。

  gcc编译过程:预处理(预处理器);编译(编译器);汇编(汇编器);链接(链接器);

  gcc编译简化:参数ESc-->文件iso;

2实践

  先建立一个c文件hello.c,并输入如下打印出"hello world!";

  

#include <stdio.h>int main(void)
{printf("hello world!\n");return 0;
}

  

  2.1下面来记录一下gcc编译过程:

  1>预处理阶段      

gcc -E hello.c -o hello.i     //使用-E参数表示编译只到预处理阶段,这个阶段生成的文件是后缀为i,也可以在-E前面加上-Wall参数显示编译信息(以下如此),初学者非常有用。

  2>编译阶段

gcc -S hello.i -o hello.s     //使用-S参数把预处理阶段生成的文件编译成汇编文件

  3>汇编阶段

gcc -c hello.s -o hello.o    //使用-c参数把汇编文件编译生成目标文件,这是二进制文件

      4>链接阶段

gcc hello.o -o hello    //目标文件链接生成可执行文件不用参数,此阶段会把相关的一些系统静态库动态库文件加入进来生成可执行文件

  以上4个步骤也可以使用一条命令完成:

gcc hello.c -o hello    //直接把c源文件编译成可执行文件

  2.2gcc多文件编译  

上面的例子是针对一个源文件的,但是往往我们在开发中是多个文件那这又怎么操作呢,下面把上面的代码拆分一下如下:

  1.建立hello_fn.h文件,文件内容如下:  

#ifndef  _HELLO_FN_H
#define _HELLO_FN_H
void print(const char* str);
#endif

  2.建立hello_fn.c文件,内容如下:

#include <stdio.h>
#include "hello_fn.h"void print(const char* str)
{printf(str);
}    

  3.建立hello_main.c文件,内容如下;

#include "hello_fn.h"int main(void)
{print("hello world!\n");return 0;   
}

  下面分步骤生成目标文件在生成可执行文件:

gcc -Wall -c hello_fn.c -o hello_fn.o    
gcc -Wall -c hello_main.c -o hello_main.o
gcc -Wall hello_fn.o hello_main.o -o hello_main

  也可以一次性生成可执行文件:

gcc -Wall hello_fn.c hello_main.c -o hello_main

  这样结果是一样,第一种方法适合多个目标文件其中一个模块发生变化此时只需要编译改变的模块最后在把所有的目标文件链接成可执行文件,现在假如hello_fn.c文件发生变化,只需要编译hello_fn.c为目标文件hello_fn.o,最后链接hello_main.o生成可执行文件。

      

转载于:https://www.cnblogs.com/luoliang/p/3843654.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转载] 晓说——第9期:多如牛毛严酷无比的美国那些法

转载于:https://www.cnblogs.com/6DAN_HUST/archive/2012/08/26/2657224.html

ARM的汇编伪指令【伪指令的解释】

本文作为此博文的伪指令章节的补充说明。 伪指令的含义 伪指令本质上不是指令。伪指令由编译器环境提供&#xff0c;用来指导编译过程&#xff0c;经过编译后伪指令不会生成机器码。 伪指令是和具体的编译器相关的。我们使用GNU工具链&#xff0c;因此学习GNU环境下的汇编伪指令…

关注 Imagine Cup 2010, 参与软件设计“最具人气奖”投票

关注 Imagine Cup 2010, 参与软件设计“最具人气奖”投票 Imagine Cup 2010全球总决赛将于7月3日到7月8日在波兰华沙举行。现在通过参与软件设计“最具人气”奖投票&#xff0c;你也可以参与到Imagine Cup 2010中。了解全球学生是如何用科技创新帮助我们解决人类面临的最困难问…

浏览器模拟用户登陆

javascript:document.getElementById(user).valuejack;document.getElementById(password).valuetest;submitForm();void(0);转载于:https://www.cnblogs.com/ahghy/p/3488839.html

Bzoj 2127 happiness 最小割

happiness 题解: 将图转换成最小割. 将割完的图中与S相连的点看做选文科, 与T相连的点看做选理科. flow(s, u) 文科值 flow(u,t) 理科值 假设u 和 v 一起选文科有奖励值z, flow(s,u) z/2 flow(s,v) z/2, flow(u,v) z/2 假设u 和 v 一起选理科有奖励值z, flow(u,t) z/2…

C中静态存储区和动态存储区

c语言中需要内存来存放数据。而内存主要分为两类&#xff1a;静态存储区和动态存储区。 1、静态存储区 &#xff08;1&#xff09;分为数据区&#xff08;只读数据区&#xff08;代码区&#xff1f;在linux中又叫文本段.text&#xff09;、读写数据区.data&#xff09;、未初始…

POJ 1149 最大流建图 PIGS

题意&#xff1a; 给出猪圈个数 m 和买家人数 n 然后给出m个猪圈的猪的头数.. 接下来 n 行.. 给出mm a1 a2 .. a(mm) k 例如 2 1 5 3 表示第i1个用户 有mm(2) 个猪圈的钥匙 就是有第 a1(1) 个和第 a2(5) 个猪圈的钥匙..还想要买得k头猪.. 问最多能够卖出多少头.. 思路&#xff…

【编译打包】tengine 1.5.2

tengine 官方没有提供rpm包&#xff0c;应网友要求&#xff0c;本文继续提供SRPM 包去掉了不相关的模块&#xff0c;支持平台为 rhel6 系列&#xff0c;适用于Web&#xff0c;LB&#xff0c;cache等场合。编译参数如下./configure \--prefix%{_sysconfdir}/nginx \--sbin-path%…

ARM通识——ARM的7种基本工作模式、37个通用寄存器

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、ARM采用32位架构 ARM约定一个Byte是8 bits&#xff0c;一个Halfword是16 bits (2 byte)&#xff0c;一个Word是32 bits (4 byte)。 大部分ARM core 提供ARM 指令集&#xff08;32 bit&#xff0…

软件测试工程师核心竞争力(转)

说明&#xff1a;总结整理来源于网络&#xff0c;并非独立原创 1、传统测试工程师应具备的核心竞争力1.1 测试策略设计能力测试策略设计能力是指&#xff1a;对于各种不同的被测软件&#xff0c;能够快速准确地理解需求&#xff0c;并在有限的时间和资源下&#xff0c;明确测试…

以NFS方式挂载rootfs的设置方法

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 更多详细内容&#xff0c;见Linux中NFS服务器的配置(/etc/export)_天糊土的博客-CSDN博客 网络文件系统&#xff08;NFS&#xff0c;network file system&#xff09;&#xff0c;是一种网络通讯协…

cocos2dx xcode5 创建项目

我的开发环境MacBook Pro OS X 10.9.1&#xff0c;Xcode5。 下载cocos2dx并解压&#xff0c;我使用的版本是2.2.1&#xff0c;3.0beta版本还没出来。 终端cd到cocos2d-x-2.2.1/tools/project-creator&#xff0c;我的全路径是/Users/HanHongmin/Documents/cocos2d-x-2.2.1/too…

poj 3660(floyd 变形)

题意&#xff1a; 有N头牛&#xff0c;每头牛都会有比他强的或者弱的牛&#xff0c;按照牛的强弱排序&#xff0c;问有几头牛的位置是确定的。 5 5&#xff08;n,m&#xff09; 4 3 4 2 3 2 1 2 2 5则4>3>2>5 && 1>2>5故只有2,5是确定的。 1 #include &…

分析根文件系统中的/linuxrc文件(附带busybox的介绍)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考博客 init进程的详解_天糊土的博客-CSDN博客_init进程 busybox详解_linuxarmsummary的博客-CSDN博客 前言 因为uboot给内核传参的bootargs中有“init/linuxrc”这个项目&#xff0c;而由前面的…

Wisconsin Squares [USACO]

这个也不记得了&#xff0c;反正不难 /* ID: zhangyc1 LANG: C TASK: wissqu */ #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> using namespace std;char arrMatrix[4][5]; bool arrNewCow[4][…

CentOS Linux搭建SVN Server配置详解

PS&#xff1a;今天给开发的同事搭建一个公网的SVN Server&#xff0c;google一下&#xff0c;发现下面这篇最详细&#xff0c;就记录下来&#xff0c;重新排版一下。顺便根据自己的使用经验&#xff0c;补充了几个细节和总结。本文配置是基于CentOS 5.x的&#xff0c;但一样适…

bic,orr——设置某些位为0或者1

转载于http://blog.chinaunix.net/uid-28458801-id-4083986.html 一、bic &#xff08;1&#xff09;格式&#xff1a;BIC {条件} {S} 目的寄存器&#xff0c;操作数1&#xff0c;操作数2&#xff1b; &#xff08;2&#xff09;BIC指令用于清除操作数1的某些位&#xff0…

405 Method Not Allowed

当jquery easyui的datagrid插件使用.json文件为数据源&#xff0c;通过非http协议访问【就是直接拖进浏览器查看效果】&#xff0c;能正常加载.json文件并且生成datagrid数据源。但是通过http协议访问示例代码时&#xff0c;无法加载json文件生成datagrid的数据源。 这个是由于…

Eclipse之ANT使用

Ant是Java平台下非常棒的批处理命令执行程序&#xff0c;能非常方便地自动完成编译&#xff0c;测试&#xff0c;打包&#xff0c;部署等等一系列任务&#xff0c;大大提高开发效率。如果你现在还没有开始使用Ant&#xff0c;那就要赶快开始学习使用&#xff0c;使自己的开发水…

idea修改maven项目版本号

1 先安装插件 2 控制台执行命令 mvn build-helper:parse-version versions:set -DnewVersion1.1-SNAPSHOT versions:commit 1.1-SNAPSHOT 为你要修改的版本号 技术交流群&#xff1a; 816227112 有时候命令执行完看不到改变&#xff0c;需要刷新下。 转载于:https://www.cnblo…