目录
C/C++的编译过程(2)——实际过程
在我们程序写完之后,如果你使用的是IDE那这些编译过程会一并执行。
如果不是我们需要编译工具去一步一步运行。
具体过程命令如下(这里使用gcc):
(1).预处理(preprocessing) , 生成.i文件 :找头文件,展开宏
gcc -E -o main.i main.c
gcc -E -o sub.i sub.c
(2).编译(compilation),生成.s文件:
gcc -S -o main.s main.i
gcc -S -o sub.s sub.i
(3).汇 编(assembly)生成.o文件:
gcc -c -o main.o main.s
gcc -c -o sub.o sub.s
(4)链接(linking):
将所有.o .a .so文件合并在一起→输出可执行文件
gcc -o test main.o sub.o /*在这里可以理解为在生成链接的过程中生成了.a 或 .so 文件。
(也可以手动生成:
实际上.a 和 .so文件是可以通过.o文件来产生的
gcc -shared -o libsub.so sub.o
ar crs libsub.a sub.o
最后
gcc -o test main.o libsub.so
或
gcc -o test main.o libsub.a
gcc -o test main.o -L ./ -lsub 去指定路径查找。(-lsub 就是libsub.so文件)
)
############
实际上这些过程生成时不必一步一步生成,可以两步,三步一起都是可以的。
如:
gcc -c -o main.o main.i
从.i文件→直接到.o文件。
############
文件的查找
(1).库文件和头文件的寻找
以上面的为例:
#include <stdio.h> printf函数 --stdio.c stdio.h
尽管我们没有定义#include ,会去默认系统目录去找头文件;
对应的库,也会去默认系统目录去找;(库对应的 stdio.c定义了printf函数)
#include "sub.h" sub_fun函数 -- sub.c sub.h
可以自定义路径头文件,库的路径
如:
头文件 -I: gcc -c -o main.o main.c -v -I ./
库 -L: gcc -o test main.o -lsub -L /libsub.so/所在目录/
(2).我们已经生成了可执行文件,./test 时仍然执行不了
运行时仍然找不到库,所以需要更改修改环境变量
export LDLIBRARYPATH=$LDLIBRARYPATH:./ (./当前目录)
运行:
./test
/以上的四个过程:有时候将前面三个称为编译,有时候将四个过程全部都称为编译/