文章目录

  • GCC
    • gcc编译过程
    • gcc编译多文件
  • gdb
  • 动态库和静态库
      • 创建静态库
      • 使用静态库
    • 动态库
        • 动态库的创建
        • 动态库的使用
      • 静态库和动态库的区别
  • make
    • make是什么
      • 1 make命令和Makefile文件
      • 2 MakefiIe文件编写
        • makefile抒写规则
      • make
        • Makefile文件中的变量
        • Makefile通配符
      • automake

GCC

gcc是GNU Compiler Collection

gcc [选项] 参数
-o 指定目标文件的名称
-g 使生成的可执行文件中包含debug信息
-c 只编译不连接
-E 只做预处理
-S 由C翻译成汇编
ouc-13@ouc-13:~/hanfeng$ vim main.c
#include<stdio.h>
int main(){printf("hello first\n");return 0;
}ouc-13@ouc-13:~/hanfeng$ gcc main.c
#生成了个a.out
# 执行a.out
ouc-13@ouc-13:~/hanfeng$ ./a.out
hello firstouc-13@ouc-13:~/hanfeng$ gcc -o first main.c
#生成了个first
gcc编译过程
ouc-13@ouc-13:~/hanfeng$ vim main.c
#include<stdio.h>
#define PI 3.14
int main(){printf("hello\n");return 0;
}
# ===========预编译========得到.i文件===
ouc-13@ouc-13:~/hanfeng$ gcc main.c -E -o main.i
ouc-13@ouc-13:~/hanfeng$ cat main.i | tail -15extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
# 864 "/usr/include/stdio.h" 3 4
extern int __uflow (FILE *);
extern int __overflow (FILE *, int);
# 879 "/usr/include/stdio.h" 3 4# 2 "main.c" 2# 3 "main.c"
int main(){printf("hello2\n");return 0;
}# ===========编译=============得到.s文件===
ouc-13@ouc-13:~/hanfeng$ gcc main.i -S
ouc-13@ouc-13:~/hanfeng$ cat main.s | head -15.file   "main.c".text.section        .rodata
.LC0:.string "hello".text.globl  main.type   main, @function
main:
.LFB0:.cfi_startprocpushq   %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq    %rsp, %rbp
# ==========汇编============得到main.o二进制文件=====
ouc-13@ouc-13:~/hanfeng$ gcc main.s -c
# ==========链接============默认得到a.out可执行文件===可以通过-o指定文件名
ouc-13@ouc-13:~/hanfeng$ gcc main.o -o second
ouc-13@ouc-13:~/hanfeng$ ./second
hello2
gcc编译多文件
ouc-13@ouc-13:~/hanfeng$ vim multi.c
#include <stdio.h>
#include "bank.h"
int main(){int a=5,b=18,c;c=max(a,b);printf("a与b的最大值为%d\n",c);
}ouc-13@ouc-13:~/hanfeng$ vim m.c
int max(int a,int b){return a>b?a:b;
}ouc-13@ouc-13:~/hanfeng$ vim bank.h
int max(int,int);
# 方法1=======多个文件一起编译===实际上上多个源文件分别编译后再链接成test可执行文件
ouc-13@ouc-13:~/hanfeng$ gcc  multi.c m.c -o test
ouc-13@ouc-13:~/hanfeng$ ./test
a与b的最大值为18
# 方法2====分别编译===
gcc -c multi.c # 编译得到multi.o
gcc -c m.c # 编译得到m.o
gcc multi.o m.o -o test # multi.o 和m.o 链接成可执行文件test
struct student{int id;char name[20];float score;
};//定义了一个结构体类型,类型名为struct studenttypedef struct student{int id;char name[20];float score;
}STU;//定义了一个结构体类型,类型名为STU
用<>包含的,编译器会从系统目录中寻找头文件,系统目录指的是:/usr/lib/gcci686-linux-gnu/4.6/include/usr/local/include/usr/include/i386-linux-gnu//usr/include/用双引号""直接引起来的头文件和源文件在同一个目录下。这样,编译器就会先在该目录(当前工作目录)下搜索,如果找不到再去系统目录下搜索。可以写绝对路径,也可以在编译时指定相对路径 gcc -I 相对路径也可以将.h文件放到系统目录下,但不推荐

头文件重复包含

如果A.h中包含头文件C.h,B.h也包含了C.h,而源文件中包含了A.h和B.h。

编译时机会报错

  • 如果头文件中重复包含了一些函数的生, 那么在编译时不会出现错误

避免头文件重复包含的解决方法就是在头文件中使用条件编译进行控制:

#ifndef _MY_H//_MY_H_    通常用大写,并且加上适当的下划线;
#define _MY_H_#endif

gdb

ouc-13@ouc-13:~/hanfeng$ vim gdbtest.c
#include <stdio.h>
int add(int start,int end){int i,sum;for(i=start;i<=end;i++){sum+=i;}return sum;
}
int main(){int result;result = add(1,10);printf("result=%d\n",result);return 0;
}# -g 使生成的可执行文件中包含debug信息
ouc-13@ouc-13:~/hanfeng$ gcc -o gdbtest gdbtest.c -g
ouc-13@ouc-13:~/hanfeng$ ./gdbtest
result=55 # 不知道这么我正常计算出来了,按理说因为sum没有初始化,所以得不到正确的值。我们就暂且认识他没有得到正确值吧ouc-13@ouc-13:~/hanfeng$ gdb gdbtest
GNU gdb (Ubuntu 8.2-0ubuntu1) 8.2
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:<http://www.gnu.org/software/gdb/documentation/>.For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from gdbtest...(no debugging symbols found)...done.
(gdb)
(gdb) run
Starting program: /home/ouc-13/hanfeng/gdbtest
result=55
[Inferior 1 (process 20984) exited normally]
(gdb) start
Temporary breakpoint 1 at 0x555555555166: file gdbtest.c, line 11.
Starting program: /home/ouc-13/hanfeng/gdbtestTemporary breakpoint 1, main () at gdbtest.c:11
11              result = add(1,10);
(gdb) s # step的简写,执行一条源代码,如果有函数调用,则进入该函数
add (start=1, end=10) at gdbtest.c:4
4               for(i=start;i<=end;i++){
(gdb) bt # 查看栈帧
#0  add (start=1, end=10) at gdbtest.c:4
#1  0x0000555555555175 in main () at gdbtest.c:11(gdb) i locals # 查看栈顶栈帧add中的局部变量中 # i是info的简写
i = 0
sum = 0
(gdb) frame 1 # 选择1号栈帧
#1  0x0000555555555175 in main () at gdbtest.c:11
11              result = add(1,10);
(gdb) i locals
result = 0(gdb) frame 0 # 切换回0号栈帧
#0  add (start=1, end=10) at gdbtest.c:4
4               for(i=start;i<=end;i++){
(gdb) i locals
i = 0
sum = 0
(gdb) set var sum=100 # 设置变量sum为100
(gdb) p sum # p为print简写,打印sum的值
$1 = 100
(gdb) finish # 运行到当前函数返回
Run till exit from #0  add (start=1, end=10) at gdbtest.c:4
0x0000555555555175 in main () at gdbtest.c:11
11              result = add(1,10);
Value returned is $2 = 155# finishi为让程序一直运行到当前函数返回
# continue简写c,为运行到程序结束

设置断点

break <function> 运行到指定函数时停住
break <linenum> 运行到指定行号
break breakpoint [n] 删除某个断点
delete 删除所有断点

可以按照CodeBlocks可视化界面

apt-get install codeblocks
codeblocks

动态库和静态库

链接结点除了会将汇编阶段生成的多个目标文件(.o文件)链接成一个可执行文件,还包括目标文件与库文件进行链接生成可执行文件。

库文件跟.o文件格式类似,因此是一种可执行代码的二进制形式,可以被操作系统载入内存执行。

在linux下,.o文件、可执行文件、库文件都属于一种ELF的文件格式。

使用静态库时,连接器会找出程序锁需要的函数,然后将他们复制到执行文件,由于这种复制是完整的,所以一旦链接成功,静态库在不存在的情况下课执行文件能够正常执行。然后,动态库与静态库截然不同,动态库会在执行文件内留下一个标记指明当程序执行时必须载入的库文件,所以当执行文件指向时才动态加载库文件,而使用动态库必然会节省时间。

同时存在相同库名的静态库和动态库的话,默认将与动态库链接。

静态库是在编译过程中被加载的,锁调用的库函数代码段会成为程序组成部分链接到可执行文件中,并在执行时随可执行程序一起运行

ouc-13@ouc-13:~/hanfeng/clib$ vim bank.h
struct student{int id;char name[10];float score;
};ouc-13@ouc-13:~/hanfeng/clib$ vim sort.c
#include "bank.h"
void sortaz(struct student stu[], int n){int i,j;struct student t;for(i=0;i<n-1;i++)for(j=0;j<n-1;j++){if(stu[j].score>stu[j+1].score){t=stu[j];stu[j]=stu[j+1];stu[j+1]=t;}}
}ouc-13@ouc-13:~/hanfeng/clib$ gcc sort.c -c
# 或gcc -c sort.c
# 生成.o文件
创建静态库
# 创建静态库并将目标文件加入库中
ar -r 目标库文件名称 目标文件列表
ar -r libmath.a sort.oar是创建或操作静态库的命令,选项-r表示将目标文件加入到静态库中,
目标库文件名有个不成文的规定,一般以lib开头,以.a结尾,目标文件列表中的目标文件之间用空格隔开。
-r 将目标文件加入到静态库中
-t 显示静态库中内容
-a 将目标文件追加到静态库文件现有文件之后
-b 将目标文件追加到静态库文件现有文件之前
-d 删除目标文件
-x 提取目标文件
-p 指定文件输出到标准输出
-q 快速地把文件追击到静态库中
使用静态库
方法1:参数法
gcc 主程序 -l 静态库名(去掉lib和.a) -L 静态库存放位置方法2:直接法
gcc 主程序 静态库全名
# 我们之前已经把排序函数写到了静态库中,我们接下来要使用他ouc-13@ouc-13:~/hanfeng/clib$ vim main.c
#include <stdio.h>
#include "bank.h" //main.c和bank.h在同一目录中
void main(){struct student stu1[5];int i;for(i=0;i<5;i++){printf("请输入第%d和学生学号",i+1);scanf("%d",&stu1[i].id);printf("请输入第%d和学生名字",i+1);scanf("%s",stu1[i].name);//注意没有&printf("请输入第%d和学生得分",i+1);scanf("%f",&stu1[i].score);}sortaz(stu1,5);for(i=0;i<5;i++){printf("姓名:%s,成绩%f\n",stu1[i].name,stu1[i].score);}
}ouc-13@ouc-13:~/hanfeng/clib$
gcc main.c -l math -L .   # 静态库全名libmath.a,静态库在当前目录下,生成了a.out的可执行文件
gcc main.c -lmath -L ./ # 这么写也对
gcc main.c libmath.a
gcc main.c -o main libmath.a

动态库

动态库又称共享库,编译时链接动态库,但不加载目标代码,只有在运行时加载相关的目标代码(所调用的库函数)到内容,进程结束时自动施法其所占内存空间。

动态库的创建

仍以sort.c和bank.h为例

# 编辑sort.c bank.h文件# 生成.o文件
gcc -c -fpic sort.c
-fpic 是将源文件编译成带有PIC标志的目标文件,对于某些版本,C语言编译器可以缺省PIC标志# 创建动态库
gcc -shared xxxx.o yyyy.o -o libxxx.so
# 也可以合并上面2步
gcc -shared -fpic xxxx.c yyy.c libxxx.so
动态库的使用
方法1:参数法
gcc 主程序 -l 动态库名(去掉lib和.so) -L 动态库存放位置方法2:直接法
gcc 主程序 动态库全名
# 编译
gcc -c -fpic sort.c
# 生成动态链接库
gcc -shared sort.o -o libmath.so
# 编译主程序
gcc main.c -lmath -L ./
# 执行
./a.out
此时会报错linux动态加载器找不到libmath.so文件
我们知道动态库是在程序运行阶段进行链接,一般情况下,加载器会自动再/lib目录下搜寻动态链接库进行链接,所以一旦要将生成的动态链接库文件移动到/lib目录下
# 移动
sudo mv libmath.so /lib
./a.out

静态库和动态库的区别

我们注意到编译主程序时,静态和动态库的方式都是一样的
gcc main.c -lmath -L ./
那么我们就无法知道我们编译进去的是静态还是动态库了。我们可以指定使用静态库
gcc main.c -static -lmath -L /lib -o a1.out
此外也可以通过文件大小看

make

make是什么

所谓工程管理,其实就是管理工程项目中的多个文件。前几章编译的文件个数最多不超过5个,即便是有几个文件进行了更改,再对其进行编译即可。但工程若是由成百上千个文件构成的,而只有其中一个或少数几个文件进行了修改,如果此时不知道哪些文件被更改了,就只能使用gcc编译工具把所有文件重新编译一遍,这样会大大降低工程文件编译的效率。所以,人们就希望有一个工程管理器能够自动识别更新了的文件代码,只对更新的文件进行编译,因此make工程管理器便应运而生了。

实际上,make工程管理器起到了自动编译的作用,这里的“自动”是指它能够根据文件时间戳自动发现哪个文件更新过,这样便大大减少了编译工作量。

1 make命令和Makefile文件

make工程管理器主要是通过一个叫作Makefile的文件进行工作的。MakefiIe文件类似于一个脚本文件,make工程管理器根据里面的一些规则实现对工程的管理。其中的规则描述了软件包中各个文件之间的关系,也提供了对每个文件进行更新的命令。在一个软件包里,通常情况下可执行文件由链接目标文件和库文件更新,目标文件由源文件更新。

当存在一个MakefiIe文件时,如果要对某几个源文件进行改变,只需要使用简单的make命令就能够自动完成所有必要的重新编译。

2 MakefiIe文件编写

既然MakefiIe文件是make工程管理的核心,那么如何编写MakefiIe文件,规则的格式又是什么?

1.Makefile文件的编写
在MakefiIe中,规则的顺序是很重要的,因为,MakefiIe中只有一个最终目标,其他目标都是被这个目标所连带出来的,所以一定要让make知道你的最终目标是什么。一般来说,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终目标。

下面举例说明Makefile文件编写的具体步骤。

(])使用vi编辑器创建一个任意名字的文件(也可命名为Makefile)

(2)规则语法:

目标:目标所依赖文件1 目标所依赖文件2.TAB键 产生目标的命令

可见,规则包含两个部分内容,一个是依赖关系,另一个是生成目标的方法即命令。如果上述规则语法中的命令过长,可以使用“\”作为换行符。

每个Makefile文件必须严格按照上面的语法进行编写,在文件中要说明如何编译各个源文件并链接生成可执行文件,并要求定义源文件之间的依赖关系。Makefile的每一组规则说明了一个目标所依赖的文件以及生成或更新目标所需要的命令。

例:假设项目由源文件main.c、m.c、bank.h组成,为其编写Makefile规则。

# 项目的最终目标是可执行文件a.out,该目标依赖的文件有main.o和mo.o
# main.o和m.o也属于目标文件,main.o所依赖的文件是main.c和bank.h,main.o所依赖的文件是m.c和bank.h
a.out:main.o m.ogcc main.o m.o
main.o:main.c bank.hgcc -c main.c
mo.o:m.c bank.hgcc -c m.c
makefile抒写规则
make [选项] [参数] [目标]
make -f Makefile文件
make -f Makefile文件 目标文件.o
ouc-13@ouc-13:~/hanfeng/clib$ vim myMakefile
a.out:main.o sort.ogcc main.o sort.o
main.o:main.c bank.hgcc -c main.c
sort.o:sort.c bank.hgcc -c sort.couc-13@ouc-13:~/hanfeng/clib$ make -f myMakefile
gcc -c sort.c
gcc main.o sort.o
ouc-13@ouc-13:~/hanfeng/clib$ ls # 之前编译过的.o文件都删掉后makefile又全有了
a.out  bank.h  main.c  main.o  myMakefile  sort.c  sort.oouc-13@ouc-13:~/hanfeng/clib$ make -f myMakefile main.o
make: 'main.o' is up to date.

make

默认在当前目录下依次查找名字为GNUMakefile、Makefile和makefile的规则文件。

Makefile文件中的变量

可以在makefile中定义一个变量,在makefile内可以引用

变量名可以包含字符、数字、下划线,但不能包含:#=回车空格,区分大小写。

传统makefile变量是全大写的命名方式,建议由大小写组成,避免和系统变量冲突。

使用能力时,在前面加上$即可,建议用{}()括起来

ouc-13@ouc-13:~/hanfeng/clib$ vim myMakefile
OBJC=main.o sort.o
C=-c
a.out:$(OBJC)gcc $(OBJC)
main.o:main.c bank.hgcc $(C) main.c
sort.o:sort.c bank.hgcc $(C) sort.c

还有些默认的变量

RM 删除文件的目录,默认值为rm -f
$+ 所有的依赖文件,不去除重复的依赖目标
$^ 所有的依赖文件,去除重复的依赖目标
$< 表示第一个依赖文件
$? 所有的依赖文件,以空格隔开,这些依赖文件比模板还要新(即更新时间比模板晚)
$@ 表示目标文件
$% 仅当目标是函数库文件中,表示规则中的目标成员名
Makefile通配符
&
?
[]
通配符只能用在以下两个位置:
可以用在规则的目标、依赖中,make在读取makefile时会自动对其进行匹配处理(通配符展开)
可以出现在规则的命令中,通配符的通配处理是在shell执行命令时完成的。

makefile的条件执行

ifeq(,)gcc -o ex1 model
elsegcc -o ex2 model
endif

automake

automake可以让我们免于手写Makefile文件

我们使用autoconf和automake两个工具来帮助我们自动地生成符合自由软件惯例的makefile,这样就可以像常见的GNU程序一样,只要使用./configuremakemake install就可以把程序安装到linux系统中去了

automake是什么?

automake是一个从文件Makefile.am自动生成Makefile.in的工具。每个Makefile.am基本上是一系列make的宏定义或make规则。由automake生成的MakefiIe.in遵循GNUMakefiIe标准。GNUMakefiIe标准文档长、复杂,而且会发生改变。automake的目的就是减轻维护MakefiIe的负担。典型的automake输入文件是一系列简单的宏定义,处理所有这样的文件以创建MakefiIe.in。在一个项目(project)的每个目录中通常包含一个Makefile.amoautomake生成MakefiIe的主要步骤如下。

  • 1)创建源代码文件,使用"autoscan”生成configurescan文件,将其重命名为configure.ac,并做适当修改。
  • 2)使用"aclocal"命令生成aclocal.m4文件。
  • 3)使用"autoconf,命令由configure、ac和aclocal.m4文件生成configure文件。
  • 4)手工编辑Makefile.am文件,使用"automake”命令生成configure.in文件。
  • 5)手工编辑或由系统给定acconfig.h文件,使用"autoheader”命令生成config.h.tn文件。
  • 6)使用"configure”命令由configure、configure.in和config.h.in文件生成Makefile文件,从而完成MakefiIe文件的创建过程。
ouc-13@ouc-13:~/hanfeng/clib$ mkdir automake
ouc-13@ouc-13:~/hanfeng/clib$ cd automake/
ouc-13@ouc-13:~/hanfeng/clib/automake$ vim main.c
#include<stdio.h>
int main(){printf("auto makefile\n");return 0;
}
ouc-13@ouc-13:~/hanfeng/clib/automake$ autoscan
Command 'autoscan' not found, but can be installed with:
sudo apt install autoconfouc-13@ouc-13:~/hanfeng/clib/automake$ sudo apt install autoconf
ouc-13@ouc-13:~/hanfeng/clib/automake$ ls
main.c
ouc-13@ouc-13:~/hanfeng/clib/automake$ autoscan
ouc-13@ouc-13:~/hanfeng/clib/automake$ ll
-rw-rw-r-- 1 ouc-13 ouc-13    0 9月  27 01:12 autoscan.log # 新生成的
-rw-rw-r-- 1 ouc-13 ouc-13  466 9月  27 01:12 configure.scan # 新生成的
-rw-rw-r-- 1 ouc-13 ouc-13   71 9月  27 00:40 main.couc-13@ouc-13:~/hanfeng/clib/automake$ mv configure.scan configure.inouc-13@ouc-13:~/hanfeng/clib/automake$ vim configure.in
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([main.c])
AC_CONFIG_HEADERS([config.h])# Checks for programs.
AC_PROG_CC# Checks for libraries.# Checks for header files.# Checks for typedefs, structures, and compiler characteristics.# Checks for library functions.AC_OUTPUT
~
#======================修改为=====================
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.AC_PREREQ([2.69])
# 修改
AC_INIT([main], [1.0], [hhh@qq.com])
AC_CONFIG_SRCDIR([main.c])
AC_CONFIG_HEADERS([config.h])
#新增宏AC_INIT_AUTOMAKE,这个是automake所必备的宏
AM_INIT_AUTOMAKE(make,1.0)
# Checks for programs.
AC_PROG_CC# Checks for libraries.# Checks for header files.# Checks for typedefs, structures, and compiler characteristics.# Checks for library functions.
# 修改,添加输出文件Makefile
AC_OUTPUT([Makefile])
ouc-13@ouc-13:~/hanfeng/clib/automake$ aclocal
ouc-13@ouc-13:~/hanfeng/clib/automake$ ls
drwxr-xr-x 2 ouc-13 ouc-13   4096 9月  27 01:21 autom4te.cache/ # 新生成,主要处理本地的宏定义
-rw-rw-r-- 1 ouc-13 ouc-13      0 9月  27 01:12 autoscan.log
-rw-rw-r-- 1 ouc-13 ouc-13    504 9月  27 01:17 configure.in
-rw-rw-r-- 1 ouc-13 ouc-13     71 9月  27 00:40 main.c
ouc-13@ouc-13:~/hanfeng/clib/automake$ autoconf
configure.in:10: error: possibly undefined macro: AC_INIT_AUTOMAKEIf this token and others are legitimate, please use m4_pattern_allow.See the Autoconf documentation.
ouc-13@ouc-13:~/hanfeng/clib/automake$ sudo apt-get install libtool
ouc-13@ouc-13:~/hanfeng/clib/automake$ autoconf
ouc-13@ouc-13:~/hanfeng/clib/automake$ ll
drwxr-xr-x 2 ouc-13 ouc-13   4096 9月  27 01:21 autom4te.cache/
-rw-rw-r-- 1 ouc-13 ouc-13      0 9月  27 01:12 autoscan.log
-rwxrwxr-x 1 ouc-13 ouc-13 111849 9月  27 01:21 configure* # 新生成
-rw-rw-r-- 1 ouc-13 ouc-13    504 9月  27 01:17 configure.in
-rw-rw-r-- 1 ouc-13 ouc-13     71 9月  27 00:40 main.couc-13@ouc-13:~/hanfeng/clib/automake$ autoheader
ouc-13@ouc-13:~/hanfeng/clib/automake$ ll
drwxr-xr-x 2 ouc-13 ouc-13   4096 9月  27 01:21 autom4te.cache/
-rw-rw-r-- 1 ouc-13 ouc-13      0 9月  27 01:12 autoscan.log
-rw-rw-r-- 1 ouc-13 ouc-13    539 9月  27 01:26 config.h.in # 新生成。该工具通常会从acconfig.h文件中复制用户附加的符号定义,因此此处没有附加符号定义,所以不需要创建acconfig.h文件
-rwxrwxr-x 1 ouc-13 ouc-13 111849 9月  27 01:21 configure*
-rw-rw-r-- 1 ouc-13 ouc-13    504 9月  27 01:17 configure.in
-rw-rw-r-- 1 ouc-13 ouc-13     71 9月  27 00:40 main.c# 新建Makefile.am,这是创建Makefile的重要一步。其使用automake对其生成configure.in文件,在这里使用-add-missing可以让automake添加一些必须的脚本文件
ouc-13@ouc-13:~/hanfeng/clib/automake$ vim Makefile.am
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=main
main_SOURCES=main.c# 其中的AUTOMAKEOPTIONS为设置automake的选项。由于GNU(在第]章中已经有所介绍)对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了三种软件等级:foreign、gnu和gnits,供用户选择,默认等级为gnuo在本例使用foreign等级,它只检测必需的文件。
#bin_PROGRAMS定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开巴
#mainSOURCES定义"main”这个执行程序所需要的原始文件。如果"main”这个程序是由多个原始文件所组成的,则必须把它所用到的所有原始文件都列出来,并用空格隔开。例如:若目标体"main"需要"main.c","sunq.c".main.h”三个依赖文件,则定义mainSOURCES=main.c sunq.c main.h,要注意的是,如果要定义多个执行文件,则对每个执行程序都要定义相应的fiIe_SOURCES。ouc-13@ouc-13:~/hanfeng/clib/automake$ automake --add-missing
automake: warning: autoconf input should be named 'configure.ac', not 'configure.in'
configure.in:10: warning: AM_INIT_AUTOMAKE: two- and three-arguments forms are deprecated.  For more info, see:
configure.in:10: https://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_005fINIT_005fAUTOMAKE-invocation
configure.in:12: installing './compile'
configure.in:10: installing './install-sh'
configure.in:10: installing './missing'
automake: warning: autoconf input should be named 'configure.ac', not 'configure.in'ouc-13@ouc-13:~/hanfeng/clib/automake$ ls
aclocal.m4      autoscan.log  config.h.in   configure     depcomp     main.c       Makefile.in
autom4te.cache  compile       config.h.in~  configure.in  install-sh  Makefile.am  missing-rw-rw-r-- 1 ouc-13 ouc-13  41888 9月  27 01:34 aclocal.m4
drwxr-xr-x 2 ouc-13 ouc-13   4096 9月  27 01:36 autom4te.cache/
-rw-rw-r-- 1 ouc-13 ouc-13      0 9月  27 01:12 autoscan.log
lrwxrwxrwx 1 ouc-13 ouc-13     32 9月  27 01:36 compile -> /usr/share/automake-1.16/compile*
-rw-rw-r-- 1 ouc-13 ouc-13    625 9月  27 01:35 config.h.in
-rw-rw-r-- 1 ouc-13 ouc-13    539 9月  27 01:26 config.h.in~
-rwxrwxr-x 1 ouc-13 ouc-13 146208 9月  27 01:34 configure*
-rw-rw-r-- 1 ouc-13 ouc-13    504 9月  27 01:33 configure.in
lrwxrwxrwx 1 ouc-13 ouc-13     32 9月  27 01:30 depcomp -> /usr/share/automake-1.16/depcomp*
lrwxrwxrwx 1 ouc-13 ouc-13     35 9月  27 01:36 install-sh -> /usr/share/automake-1.16/install-sh*
-rw-rw-r-- 1 ouc-13 ouc-13     71 9月  27 00:40 main.c
-rw-rw-r-- 1 ouc-13 ouc-13     63 9月  27 01:30 Makefile.am
-rw-rw-r-- 1 ouc-13 ouc-13  24161 9月  27 01:36 Makefile.in
lrwxrwxrwx 1 ouc-13 ouc-13     32 9月  27 01:36 missing -> /usr/share/automake-1.16/missing*# 运行configure,通过运行自动配置文件configure,吧Makefile.in变成了Makefile文件
ouc-13@ouc-13:~/hanfeng/clib/automake$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking whether gcc understands -c and -o together... yes
checking whether make supports the include directive... yes (GNU style)
checking dependency style of gcc... gcc3
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: executing depfiles commandsouc-13@ouc-13:~/hanfeng/clib/automake$ ll
-rw-rw-r-- 1 ouc-13 ouc-13  41888 9月  27 01:34 aclocal.m4
drwxr-xr-x 2 ouc-13 ouc-13   4096 9月  27 01:36 autom4te.cache/
-rw-rw-r-- 1 ouc-13 ouc-13      0 9月  27 01:12 autoscan.log
lrwxrwxrwx 1 ouc-13 ouc-13     32 9月  27 01:36 compile -> /usr/share/automake-1.16/compile*
-rw-rw-r-- 1 ouc-13 ouc-13    752 9月  27 01:38 config.h
-rw-rw-r-- 1 ouc-13 ouc-13    625 9月  27 01:35 config.h.in
-rw-rw-r-- 1 ouc-13 ouc-13    539 9月  27 01:26 config.h.in~
-rw-rw-r-- 1 ouc-13 ouc-13   9629 9月  27 01:38 config.log
-rwxrwxr-x 1 ouc-13 ouc-13  32502 9月  27 01:38 config.status*
-rwxrwxr-x 1 ouc-13 ouc-13 146208 9月  27 01:34 configure*
-rw-rw-r-- 1 ouc-13 ouc-13    504 9月  27 01:33 configure.in
lrwxrwxrwx 1 ouc-13 ouc-13     32 9月  27 01:30 depcomp -> /usr/share/automake-1.16/depcomp*
drwxrwxr-x 2 ouc-13 ouc-13   4096 9月  27 01:38 .deps/
lrwxrwxrwx 1 ouc-13 ouc-13     35 9月  27 01:36 install-sh -> /usr/share/automake-1.16/install-sh*
-rw-rw-r-- 1 ouc-13 ouc-13     71 9月  27 00:40 main.c
-rw-rw-r-- 1 ouc-13 ouc-13  23961 9月  27 01:38 Makefile
-rw-rw-r-- 1 ouc-13 ouc-13     63 9月  27 01:30 Makefile.am
-rw-rw-r-- 1 ouc-13 ouc-13  24161 9月  27 01:36 Makefile.in
lrwxrwxrwx 1 ouc-13 ouc-13     32 9月  27 01:36 missing -> /usr/share/automake-1.16/missing*
-rw-rw-r-- 1 ouc-13 ouc-13     23 9月  27 01:38 stamp-h1# 运行make,对配置文件Makefile进行测试
ouc-13@ouc-13:~/hanfeng/clib/automake$ make
make  all-am
make[1]: Entering directory '/home/ouc-13/hanfeng/clib/automake'
gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
mv -f .deps/main.Tpo .deps/main.Po
gcc  -g -O2   -o main main.o
make[1]: Leaving directory '/home/ouc-13/hanfeng/clib/automake'
ouc-13@ouc-13:~/hanfeng/clib/automake$ ll
total 352
drwxrwxr-x 4 ouc-13 ouc-13   4096 9月  27 01:39 ./
drwxrwxr-x 3 ouc-13 ouc-13   4096 9月  27 00:39 ../
-rw-rw-r-- 1 ouc-13 ouc-13  41888 9月  27 01:34 aclocal.m4
drwxr-xr-x 2 ouc-13 ouc-13   4096 9月  27 01:36 autom4te.cache/
-rw-rw-r-- 1 ouc-13 ouc-13      0 9月  27 01:12 autoscan.log
lrwxrwxrwx 1 ouc-13 ouc-13     32 9月  27 01:36 compile -> /usr/share/automake-1.16/compile*
-rw-rw-r-- 1 ouc-13 ouc-13    752 9月  27 01:38 config.h
-rw-rw-r-- 1 ouc-13 ouc-13    625 9月  27 01:35 config.h.in
-rw-rw-r-- 1 ouc-13 ouc-13    539 9月  27 01:26 config.h.in~
-rw-rw-r-- 1 ouc-13 ouc-13   9629 9月  27 01:38 config.log
-rwxrwxr-x 1 ouc-13 ouc-13  32502 9月  27 01:38 config.status*
-rwxrwxr-x 1 ouc-13 ouc-13 146208 9月  27 01:34 configure*
-rw-rw-r-- 1 ouc-13 ouc-13    504 9月  27 01:33 configure.in
lrwxrwxrwx 1 ouc-13 ouc-13     32 9月  27 01:30 depcomp -> /usr/share/automake-1.16/depcomp*
drwxrwxr-x 2 ouc-13 ouc-13   4096 9月  27 01:39 .deps/
lrwxrwxrwx 1 ouc-13 ouc-13     35 9月  27 01:36 install-sh -> /usr/share/automake-1.16/install-sh*
-rwxrwxr-x 1 ouc-13 ouc-13  19576 9月  27 01:39 main*
-rw-rw-r-- 1 ouc-13 ouc-13     71 9月  27 00:40 main.c
-rw-rw-r-- 1 ouc-13 ouc-13   7112 9月  27 01:39 main.o
-rw-rw-r-- 1 ouc-13 ouc-13  23961 9月  27 01:38 Makefile
-rw-rw-r-- 1 ouc-13 ouc-13     63 9月  27 01:30 Makefile.am
-rw-rw-r-- 1 ouc-13 ouc-13  24161 9月  27 01:36 Makefile.in
lrwxrwxrwx 1 ouc-13 ouc-13     32 9月  27 01:36 missing -> /usr/share/automake-1.16/missing*
-rw-rw-r-- 1 ouc-13 ouc-13     23 9月  27 01:38 stamp-h1# 再执行可执行文件main
ouc-13@ouc-13:~/hanfeng/clib/automake$ ./main
auto makefile

linux编程GCC、gdb、Makefile、make、相关推荐

  1. 小羊手把手教你gcc gdb makefile

    1. vim编辑hello.c 2. 分别查看下面gcc指令的结果 GCC交叉编译器简介: 最早为GNU C Compiler是GNU推出的功能强大.性能优越的多平台编译器,是GNU的代表作之一; 支 ...

  2. Linux命令全家桶以及vim/gcc/gdb/makefile/yum

    基本指令 ls指令:对于目录,列出该目录下的所有子目录与文件:对于文件,列出文件名以及其他信息. ls -l //一行只输出一个文件 pwd指令:显示当前用户所在目录 cd指令:改变工作目录,将当前工 ...

  3. Linux~一些基本开发工具的使用(yum,vim,gcc,gdb,makefile)

    目录 一.yum--安装软件 二.Vim--文本编辑器 (1).命令模式 (2).底行模式 (3).插入模式 tips:给对应用户配置sudo命令 一些注意事项 三.gcc/g++--编译器 (1). ...

  4. Linux——(二)环境基础开发工具(yum,vim,gcc,gdb,makefile,git)

    本节目录 总述 1. yum:软件包管理工具 1.1 软件包是什么? 1.2 软件包的操作 1.2.1 查看 1.2.2 安装 1.2.3 卸载 2. vim:linux编辑器 2.1 vim基本概念 ...

  5. Linux下make使用gcc编译,Linux下GCC和Makefile实例(从GCC的编译到Makefile的引入)

    一.确认已经装好了GCC和Make的软件包 可以使用whereis命令查看: 如果whereis  gcc和whereis  make命令有结果,说明安装了这两个软件,可以继续往下做. 二.使用GCC ...

  6. 【Linux】gcc + gdb 安装教程

    gcc安装 不知为何,我的桌面上有两个光盘,所以在第5步执行命令时用的是cdrom1才可以. gdb安装 1.打开终端,切换到root目录:su 2.切换到mnt目录下:cd   /mnt 3.ls查 ...

  7. Linux下GCC和Makefile实例(从GCC的编译到Makefile的引入) 转

    http://www.crazyant.net/2011/10/29/linux%E4%B8%8Bgcc%E5%92%8Cmakefile%E5%AE%9E%E4%BE%8B%EF%BC%88%E4% ...

  8. Linux编程基础——GDB(查看数据)

    查看栈信息 当程序被停住了,首先要确认的就是程序是在哪儿被断住的.这个一般是通过查看调用栈信息来看的.在gdb中,查看调用栈的命令是backtrace,可以简写为bt. (gdb) bt     #0 ...

  9. 《Linux编程》学习笔记 ·002【Linux常用工具GCC、GDB、Make】

    注:前言.目录见 https://blog.csdn.net/qq_44220418/article/details/108428971 文章目录 一.GCC编译器 1.GCC编译程序的流程 2.GC ...

最新文章

  1. 单例模式的3种实现方式, 及其性能对比
  2. 软件架构自学笔记--大学学的软件工程为什么感觉很“虚”
  3. c#项目转JAVA,第5个月,基本完成
  4. python sum 数组原理_Python - Sum 4D数组
  5. Python编程专属骚技巧10
  6. CSS选择器的权重详解
  7. c语言delay_单片机模拟流星雨,电路图和程序,一起来感受下,其实C语言不难...
  8. Mac下png转icns图标脚本
  9. python制作adobe photoshop插件_Adobe Ps 2021已上线,新功能秒杀一切插件
  10. 北京租房住起来舒服的地方(小区)有哪些?
  11. 怎么用表格做出html网页,用表格制作网页
  12. 可以联机的计算机游戏,多人玩的游戏_可以多人联机玩的游戏 乐游网
  13. 【英语-同义词汇词组】therefore、hence、thus的用法及区别
  14. 华人捕鱼可不可以把死鱼的几率调试的简单一点
  15. 了解工业能源统计的含义、分级以及分类
  16. 英飞凌TC275芯片开发笔记
  17. 【附源码】Python计算机毕业设计时事新闻管理系统
  18. 1.微服务架构-什么是微服务
  19. unity接入微信支付完成切换前台游戏闪退
  20. 小孩孩子应用题计算机错误,孩子做数学应用题的能力很差,该怎么办?

热门文章

  1. 潘凯:C++对象布局及多态实现的探索(八)
  2. 潘凯:C++对象布局及多态实现的探索(四)
  3. 最近公共祖先LCA问题
  4. iOS--UI之导航控制器与标签控制器
  5. ReentrantLock的实现原理
  6. 博弈论学习笔记——纳什均衡与社会最优、破坏均衡的方法
  7. es查询所欲,检索ElasticSearch中所有_id的高效方法
  8. echarts中国地图实现阴影效果自定义设置
  9. iOS 10下Webkit如何获取位置信息?
  10. 内蒙古软件开发电脑公司一览表