C程序编译过程剖析

问题一:C程序如何生成可执行程序

  • 预处理 -E
  • 编译 -S
  • 汇编 -c
  • 链接 -o

问题二:预处理要处理哪些东西

  • 宏定义:#define
  • 文件包含 #inchude
  • 条件编译 #ifdef ... #endif

预处理命令:gcc -E hello.c

小技巧 :可以使用 -D选项

例如:gcc -E -DDebug hello.c类似于在程序中#define Debug

main.h代码:

#include

#define A 1
#define B 2
int main(void)
{
    int ret = 0;
    ret = A;
#ifdef DEBUG
ret = B;
#endif
    printf("ret = %d\r\n",ret);
    return 0;
}

使用gcc -E main.c输出:

...
...
...
# 5 "main.c"
int main(void)
{
    int ret = 0;
    ret = 1;



    printf("ret = %d\r\n",ret);
    return 0;
}

使用gcc -E -DDUBUG main.c输出:

...
...
...
# 5 "main.c"
int main(void)
{
    int ret = 0;
    ret = 1;

ret = 2;

    printf("ret = %d\r\n",ret);
    return 0;
}

问题三:编译过程

  • 语法检查
  • 优化
  • 生成汇编语言文件

语法检查:检查程序中是否存在错误。

优化:可以加入-O选项来优化代码,

gcc -o hello hello.c默认选项不优化

gcc -O2 -o hello2 hello.c # 优化等次是2

gcc -Os -o hellos hello.c # 优化目标代码的大小

优化代码会节省可执行程序占用内存大小但也可能造成程序错误和降低程序执行效率。

生成汇编语言文件:相当于把c语言翻译成汇编文件

gcc -S  main.c:默认输出main.s

gcc -S -o test.s main.c指定输出test.s


问题四:汇编

将编译生成的汇编语言文件翻译为机器代码

gcc -c main.s生成main.o

问题五:链接

将一个或多个.o文件生成一个可执行文件

gcc -o test main.o

gcc -o test A.o B.o C.o

问题六:链接库

一个或多个.o文件可以编译为静态链接库和动态链接库,链接库不可执行,可以作为一个部件和其他.o文件一起生成可执行文件。

静态链接库:

ar rcsv libfunc1.a func1.o

将func1.o编译为静态库libfunc1.a(格式为lib+name.a)

然后就可以使用此链接库

gcc -o test test.o -lfunc1 -L./

-l指定静态库

-L./指定静态库的路径

动态链接库:

执行一下命令即可生成动态链接库libfunc1.so

gcc -Wall func1.o -shared -Wl,-soname,libfunc1.so.0 -o libfunc1.so.0.0

ln -sf libfunc1.so.0.0 libfunc1.so.0
ln -sf libfunc1.so.0 libfunc1.so

使用动态链接库生成可执行文件时和静态链接库一样

gcc -o test test.o -lfunc1 -L./

但是执行时需要把  LD_LIBRARY_PATH  设为当前目录

LD_LIBRARY_PATH=./ ./test

使用-static选项:

gcc -static -o test test.o -lfunc1 -L./

在不指定  -static  时会优先使用动态链接库,指定时则阻止使用动态链接库,这时会把所有静态链接库文件加入到可执行文件中,使得执行文件很大,而且加载到内存以后会浪费内存空间,因此不建议这么做。

  • .o文件本身不可以运行,仅仅是作为可执行文件、静态链接库、动态链接库的 “组件”。
  • 静态链接库和动态链接库本身也不可以执行,作为可执行文件的“组件”,它们两者也不同,前者也是可重定位文件(只不过可能是多个可重定位文件的集合),并且在链接时加入到可执行文件中去。
  • 动态链接库在链接时,库文件本身并没有添加到可执行文件中,只是在可执行文件中加入了该库的名字等信息,以便在可执行文件运行过程中引用库中的函数时由动态链接器去查找相关函数的地址,并调用它们。

你可能感兴趣的:(C语言)