【Linux】Linux中的gcc/g++编译器的使用

【Linux】Linux中的gcc/g++编译器的使用_第1张图片


目录

一、编译的过程

1、预处理阶段

1.1预处理的工作——头文件展开、去注释、宏替换、条件编译

1.2外部定义宏(-D选项)

1.3Linux中头文件的路径

2、编译——编译是把C语言处理为汇编语言

3、汇编——把汇编转为可重定向二进制目标文件(不可执行)

4、链接——把自己写的代码和C库中的代码合并成二进制程序(可执行)

二、动态链接和静态链接

1、动态链接

动态链接的优缺点

2、静态链接

静态链接的优缺点

3、程序动、静态链接的区分

3.1查看程序是动、静态的方法

3.2查看程序依赖的动态库

3.3静态程序的生成

3.4关于动、静态库的问答


一、编译的过程

观察编译和链接的内部流程,文件在每一步都发生了什么?

【Linux】Linux中的gcc/g++编译器的使用_第2张图片

1、预处理阶段

1.1预处理的工作——头文件展开、去注释、宏替换、条件编译

gcc -E test.c -o test.i

-E表示当程序处理完预处理阶段就停下来;

-o指明生成的临时文件的名称(.i)。Linux不认后缀,这个.i是给用户看的。

【Linux】Linux中的gcc/g++编译器的使用_第3张图片

1.2外部定义宏(-D选项)

gcc test.c -Dc=5//在外部给test.c定义c=5
gcc test.c -DJLY//在外部给test.c定义宏JLY

注意这里在外部定义的宏仅在生成的a.out文件中生效,原test.c文件中并无改变。

1.3Linux中头文件的路径

/usr/include/stdio.h

可以通过vim查看头文件,在头文件中搜索库函数。

可以根据头文件进行代码补齐。

2、编译——编译是把C语言处理为汇编语言

gcc -S test.c -o test.s

-S表示进行程序的编译工作,编译完成之后就停止。

3、汇编——把汇编转为可重定向二进制目标文件(不可执行)

gcc -c test.c -o test.o

4、链接——把自己写的代码和C库中的代码合并成二进制程序(可执行)

gcc test.o
gcc test.c 
gcc test.c -o mytest//将a.out改名为mytest

二、动态链接和静态链接

1、动态链接

通过链接器和库建立链接。可以理解为建立动态链接需要去C标准库等外部库里找对应的函数等。

动态链接的优缺点

优点:形成的可执行程序较小,下载便捷;能够节省磁盘存储空间,且程序加载到内存的时间快。

缺点:依赖动态库,程序的可移植性比较差。(运行时问题)

2、静态链接

静态链接指直接将所需的函数等代码直接加入到程序当中。

静态链接的优缺点

优点:不依赖第三方库,程序的运行可移植性较好。

缺点:形成的可执行程序体积大。

3、程序动、静态链接的区分

3.1查看程序是动、静态的方法

file 可执行程序

3.2查看程序依赖的动态库

ldd 可执行程序

【Linux】Linux中的gcc/g++编译器的使用_第4张图片

动态库:libxxxx.so

静态库:libxxxx.a

Linux中库的命名:去掉前缀lib,去掉后缀.so,剩下的就是库的名称。例如libc.so.6中所依赖的库为c库。

3.3静态程序的生成

Linux中可执行程序默认使用动态链接,那么静态程序可以使用-static。

sudo yum install glibc-static//安装C静态库
sudo yum install libstdc++-static//安装c++静态库
gcc test.c -o mytest_static -static//生成静态程序mytest_static

3.4关于动、静态库的问答

1、如果下载一个C语言写的程序,需不需要下载额外的C标准库?

动态文件所依赖的库基本上变化不大,而静态文件不需要依赖动态库,所以均不用额外下载C标准库。

2、静态链接,拷贝的代码从何而来?

静态链接需要系统中存在.a结尾的静态库,从该静态库中拷贝代码。

【Linux】Linux中的gcc/g++编译器的使用_第5张图片

如果系统中没有动态链接库,仅有静态链接库,即便不加-static,生成的可执行程序也是静态链接的。

3、Windows下动、静态库的区分

.dll//动态
.lib//静态

你可能感兴趣的:(Linux,linux,运维,服务器,gcc,g++)