本文介绍: *2,**由于GCC在进行编译行为时,会主动地去读取CFLAGS这个环境变量,所以,可以直接在shell定义这个环境变量,也可以makefile文件里面去定义,或者在命令行当中定义。**2,案例:**假设执行文件里面包含了4个源码文件,分别是main.chaha.c 、sin value.ccos _value.c, 这4个文件功能如下。编译器检查不出这类错误,仍然可以生成可执行文件,但是运行时会出错而导致程序崩溃。**1,make功能:**可以简化编译过程里面所下达的命令

项目九 使用gcc和make调试程序

#职业能力目标和要求
1,理解程序调试2掌握利用gcc进行调试的方法3掌握使用make编译方法

9.1 了解程序的调试

9.1.1 编译错误

9.1.2 运行错误

9.1.3 逻辑错误和语义错误

  • 如果程序里有逻辑错误,编译和运行都会很顺利,看上去也不产生任何错误信息,但是程序没有干它该干的事情,而是干了别的事情。

9.2 使用传统程序语言进行编译

9.2.1 安装GCC

1,认识GCC

2,安装GCC

#1,检查是否安装
[root@localhost ~]# rpm -qa | grep gcc
libgcc-4.8.5-39.el7.x86_64	#没有安装

#2,如果系统还没有安装GCC软件包,可以使用yum命令安装所需软件包。
#挂载ISO安装映像:
[root@localhost ~]# mount /dev/cdrom /iso
#制作用于安装的yum源文件
[root@localhost ~]# vim /etc/yum.repos.d/dev.repo
# /etc/yum.repos.d/dvd.repo
# or for ONLY the media repo, do this:
# yum --disablerepo=* --enablerepo=c6-media [command]
[dvd]
name=dvd
baseurl=file:///iso
gpgcheck=0
enabled=1
#使用yum命令查看GCC软件包的信息
[root@localhost ~]# yum info gcc
#使用yum命令安装GCC。
[root@localhost ~]# yum clean all		#清除缓存
[root@localhost ~]# yum -y install gcc		#Complete!表示安装成功
#所有软件包安装完毕,可以使用rpm命令再一次进行查询
[root@localhost ~]# rpm -qa | grep gcc
libgcc-4.8.5-39.el7.x86_64
gcc-4.8.5-39.el7.x86_64

9.2.2 单一程序:打印 hello world

1,编辑程序代码源码

[root@localhost ~]# vim hello.c
#include <stdio.h&gt;		#这个#号不是注解
int main(void)
{
     printf("Hello Worldn");
}

2,开始编译与测试运行

[root@localhost ~]# gcc hello.c
[root@localhost ~]# ll hello.c a.out	#默认生成文件
-rwxr-xr-x. 1 root root 8360 Nov 28 14:17 a.out
-rw-r--r--. 1 root root   68 Nov 28 14:16 hello.c
[root@localhost ~]# ./a.out
Hello World
#要生成目标文件object file),进行其他操作,而且执行文件文件名也不能用默认的a.out
[root@localhost ~]# gcc -c hello.c
    [root@localhost ~]# ll hello.*
-rw-r--r--. 1 root root   68 Nov 28 14:16 hello.c
-rw-r--r--. 1 root root 1496 Nov 28 14:29 hello.o		#目标文件
[root@localhost ~]# gcc -o hello hello.o
[root@localhost ~]# ll hello*
-rwxr-xr-x. 1 root root 8360 Nov 28 14:30 hello		#可执行文件(-o的结果-rw-r--r--. 1 root root   68 Nov 28 14:16 hello.c
-rw-r--r--. 1 root root 1496 Nov 28 14:31 hello.o
[root@localhost ~]# ./hello
Hello World

9.2.3 主程序,子程序链接,子程序的编译

1,撰写所需要的主程序、子程序

#我们thanks.c这个主程序去调用thanks_2.c子程序
[root@localhost ~]# vim thanks.c
#include <stdio.h&gt;
int main(void)
{
      printf("Hello Wordn");
      thanks_2();
}

[root@localhost ~]# vim thanks_2.c
#include <stdio.h&gt;
void thanks_2(void)
{
      printf("Thak youn");
}

2,进行程序的编译与链接(Link)

1,开始将源码编译成为执行binary file。
[root@localhost ~]# gcc -c thanks.c thanks_2.c
[root@localhost ~]# ll thanks*
-rw-r--r--. 1 root root   71 Nov 28 14:40 thanks_2.c
-rw-r--r--. 1 root root 1496 Nov 28 15:55 thanks_2.o	<==生成的目标文件
-rw-r--r--. 1 root root   86 Nov 28 15:55 thanks.c
-rw-r--r--. 1 root root 1560 Nov 28 15:55 thanks.o		<==生成的目标文件
[root@localhost ~]# gcc -o thanks thanks.c thanks_2.c
[root@localhost ~]# ll thanks*
-rwxr-xr-x. 1 root root 8424 Nov 28 15:56 thanks
-rw-r--r--. 1 root root   71 Nov 28 14:40 thanks_2.c
-rw-r--r--. 1 root root 1496 Nov 28 15:55 thanks_2.o
-rw-r--r--. 1 root root   86 Nov 28 15:55 thanks.c
-rw-r--r--. 1 root root 1560 Nov 28 15:55 thanks.o		<==生成执行标文件

2执行可执行文件
[root@localhost ~]# ./thanks
Hello Word
Thak you    

9.2.4 调用外部函数库:加入链接函数

#计算三角函数里面的sin90°,大多数程序语言都使用弧度而不是“角度”,180度等于3.14弧度。
[root@localhost ~]# vim sin.c
#include <stdio.h&gt;
int main(void)
{
      float value;
      value = sin ( 3.14 / 2 );
      printf("%fn",value);
}
#该结果报错我们编译时加入额外函数库链接方式
[root@localhost ~]# gcc sin.c -lm -L/lib -L/usr/lib
[root@localhost ~]# ./a.out
<==I:是加人某个函数库( library) 的意思。
<==m.libm.so函数库,其中,lib与扩展(.a或.so)需要写。

9.2.5 GCC的简易用法(编译、参数链接)

1,仅将原始码编译成为目标文件,并不制作链接功能

[root@localhost ~]# gcc -c hello.c

  • 会生成hello.o文件,但不会产生二进制可执行文件。

2,在编译的时候,依据作业环境给予执行速度优化

[root@localhost ~]# gcc -c hello.c -O

3,在进行二进制可执行文件制作时,将链接的函数库与相关的路径填入

[root@localhost ~]# gcc sin.c -lm -l/usr/lib -I/usr/include

  • -lm指的是libm.so或libm.a函数库文件。
  • -L后面接的路径是刚刚上面那个函数库的搜索目录
  • -I后面接的是源码内的include文件所在的目录

4,将编译的结果生成某个特定文件。

[root@localhost ~]# gcc -o hello hello.c

5,在编译的时候,输出较多的信息说明。

[root@localhost ~]# gcc -o hello hello.c -Wall

9.3 使用make进行宏编译

9.3.1 为什么要用make

**1,make功能:**可以简化编译过程里面所下达的命令

**2,案例:**假设执行文件里面包含了4个源码文件,分别是main.c、haha.c 、sin value.c和cos _value.c, 这4个文件的功能如下。

[root@localhost ~]# mkdir /c
[root@localhost ~]# cd /c
[root@localhost c]# vim main.c
#include <stdio.h>
#define pi 3.14159
char name[15];
float angle;

int main(void)
{  printf ("nnPlease input your name: ");
   scanf ("%s", &amp;name);
   printf ("nPlease enter the degree angle (ex> 90): " );
   scanf ("%f", &amp;angle );
   haha(name);
   sin_value(angle);
   cos_value(angle);
}
[root@localhost c]# vim haha.c
#include <stdio.h>
int haha(char name[15] )
{
   printf ("nnHi, Dear %s, nice to meet you.", name);
}
[root@localhost c]# vim sin_value.c

#include <stdio.h>
#define pi 3.14159
float angle;
void sin_value (void)
{
   float value;
   value = sin( angle / 180.* pi );
   printf ("nThe Sin is: %5.2fn", value);
}
[root@localhost c]# vim cos_value.c
#include <stdio.h>
#define pi 3.14159
float angle;
void cos_value(void)
{
   float value;
   value=cos(angle/180. * pi);
   printf ("The Cos is: %5.2fn", value) ;
}
1,先进行目标文件的编译,最终会有4*.o的文件名出现。
[root@localhost c]# gcc -c main.c
[root@localhost c]# gcc -c haha.c
[root@localhost c]# gcc -c sin_value.c
[root@localhost c]# gcc -c cos_value.c

2,链接形成可执行文件main,并加人libm的数学函数。
[root@localhost c]# gcc -o main main.o haha.o sin_value.o cos_value.o -lm -L/usr/lib -L/lib

3,本程序的运行结果,必须输人姓名、360度角的角度值来完成计算。    
[root@localhost c]# ./main    
Please input your name: Bobby
Please enter the degree angle (ex> 90): 30
Hi, Dear Bobby, nice to meet you.
The Sin is:  0.50
The Cos is:  0.87
    
    
4,用一个步骤完成上述操作
#先编辑makefile这个规则文件,内容是制作出main这个可执行文件
[root@localhost c]# vim makefile    
main: main.o haha.o sin_value.o con_value.o
        gcc -o main main.o haha.o sin_value.o cos_value.o
#尝试使用makefile制订的规则进行编译
[root@localhost c]# rm -f main *.o	<==先将之前的目标文件删除
[root@localhost c]# make
cc    -c -o main.o main.c
cc    -c -o haha.o haha.c
....       

9.3.2 了解makefile的基本语法变量

1,基本的Makefile守则

目标(target):目标文件1  目标文件2
<tab>  gcc  -0创建的可执行文件  目标文件1  目标文件2

注:创建可执行文件的语法就是按“Tab”键开头的那一行

  • 在makefile当中的#代表注解
  • 需要在命令行(例如gcc这个编译器命令)的第一个字节按 “Tab” 键。
  • 目标(target) 与相关文件(就是目标文件)之间需以“:” 隔开。
#例如执行一个命令就直接清除掉所有的目标文件与可执行文件
(1)编辑makefile 来建立新的规则,此规则的目标名称为clean。
[root@localhost c]# vim makefile    
main: main.o haha.o sin_value.o con_value.o
        gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean:
        rm -f main main.o haha.o sin_value.o cos_value.o

(2)以新的目标(clean)测试看看执行make的结果[root@localhost c]# make clean
rm -f main main.o haha.o sin_value.o cos_value.o

(3)我们可以通过shell script的“变量”来简化Makefile。
[root@localhost c]# vim makefile    
LIBS = -lm
OBJS =  main.o haha.o sin_value.o con_value.o
main:$(OBJS)
        gcc -o main $(OBJS) $(LIBS)
clean:
        rm -f main $(OBJS)                   

**2,**由于GCC在进行编译的行为时,会主动地去读取CFLAGS这个环境变量,所以,可以直接在shell定义这个环境变量,也可以在makefile文件里面去定义,或者在命令行当中定义

[root@localhost c]# CFLAGS="-Wall" make clean main
#这个操作在make上进行编译时,会取用CFLAGS的变量内容

#也可以这样:
[root@localhost c]# vim makefile    
LIBS = -lm
OBJS =  main.o haha.o sin_value.o con_value.o
CFLAGS = -Wall
main:$(OBJS)
        gcc -o main $(OBJS) $(LIBS)
clean:
        rm -f main $(OBJS)              

3,环境变量使用的规则如下:

原文地址:https://blog.csdn.net/weixin_57789471/article/details/134675900

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_5087.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注