C/C++编译过程详细解析含有生成静态库动态库方法

程序执行的四个阶段

compilesystem.png
1.预处理阶段
预处理器(cpp)根据以字符#开头的命令,修改原始的 C 程序。比如 hello.c中第 1行的 #include <stdio.h> 命令告诉预处理器读取系统头文件 stdio.h 的内容,并把它直接插入程序文本中。结果就得到了另一个 C 程序,通常是以.i作为文件扩展名
2 .编译阶段
编译器(ccl)将文本文件 hello.i翻译成文本文件 hello.s,它包含一
个汇编语言程序。该程序包含函数 main 的定义,如下所示:

            main:
            subq    $8, %rsp 
            mov1    $.LCO,%edi 
            call    puts 
            mov1    $0,%eax 
            addq    $8,%rsp 
            ret

每条语句都以一种文本格式描述了一条低级机器语言指令。汇编语言非常有用,它为不同高级语言的不同编译器提供了通用的输出语言。
3 .汇编阶段
汇编器(as)将 hello.s 翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序(relocatable object program)的格式,并将结果保存在目标文件 hello.o中。
hello.o 文件是一个二进制文件,它包含的17 个字节是函数 main的指令编码。如果我们在文本编辑器中打开 hello.o文件,将看到一堆乱码。
4 .链接阶段
注意,hello程序调用了 printf 函数,它是每个 C 编译器都提供的标准 C 库中的一个函数。printf 函数存在于一个名为 printf.o 的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到我们的 hello.o 程序中。
链接器(ld)就负责处理这种合并。结果就得到 hello 文件,它是一个可执行目标文件(或者简称为可执行文件),可以被加载到内存中,由系统执行。

gcc编译

  1. -o: 指定输出文件的名称。例如,gcc main.c -o program 会将 main.c 编译成可执行文件 program。
  2. -Wall: 开启所有警告。这会让 GCC 输出所有可能的警告信息,帮助你发现潜在的问题。
  3. -g: 生成调试信息。这个选项会在编译后生成额外的信息,用于调试程序。
  4. -c: 只编译源代码,不链接成可执行文件。这个选项可以在多个源文件之间共享目标文件,以提高编译速度。
  5. -I(i): 添加头文件搜索路径。这个选项可以指定一个目录,在编译时会在该目录下搜索头文件。
  6. -L: 添加库文件搜索路径。这个选项可以指定一个目录,在链接时会在该目录下搜索库文件。
  7. -l: 指定链接的库文件。这个选项可以指定要链接的库文件的名称。例如,-lmath 表示链接 math 库。
  8. -O: 开启优化。这个选项会让 GCC 尝试优化代码,以提高程序的执行速度。-O 后面可以跟 0、1、2、3 或 s,表示不同的优化级别。
  9. -std: 指定 C 或 C++ 的标准。例如,-std=c99 表示使用 C99 标准。
  10. -D: 定义宏。这个选项可以定义一个预处理宏。例如,-DDEBUG 表示定义一个名为 DEBUG 的宏。
  11. 编译一个简单的 C 程序,输出文件名为 program
gcc main.c -o program
  1. 编译一个 C 程序,开启所有警告和调试信息,输出文件名为 program
gcc -Wall -g main.c -o program
  1. 编译多个源文件,生成目标文件,不链接成可执行文件:
gcc -c main.c
gcc -c utils.c
  1. 编译一个 C 程序,链接 math 库:
gcc main.c -o program -lmath 
  1. 编译一个 C 程序,定义一个名为 DEBUG 的宏:
gcc -DDEBUG main.c -o program
静态库制作及使用步骤:

静态库是一种预编译的二进制代码集合,其中包含多个目标文件(.o 文件)。它们可以在编译期间链接到程序中,以提供程序所需的功能和库函数。以下是制作和使用静态库的一般步骤:

  1. 创建目标文件:使用编译器将源代码编译成目标文件(.o 文件)。例如,使用 gcc 编译器可以使用以下命令创建目标文件:gcc -c file1.c file2.c
  2. 创建静态库:使用 ar 工具将多个目标文件打包成静态库。例如,使用以下命令创建名为 libmylib.a 的静态库:ar rcs libmylib.a file1.o file2.o
    • r: 将目标文件插入到静态库中,如果库中已存在同名文件,则替换。
    • c: 如果静态库不存在,则创建静态库。
    • s: 在静态库中创建索引,以加快链接速度。
  3. 使用静态库:将静态库链接到程序中,以使用其中的函数。例如,使用以下命令将静态库链接到程序中:

gcc -o myprogram myprogram.c -L . -lmylib

  • -o: 指定输出文件的名称。
  • -L.: 指定库文件的目录(在当前目录中查找)。
  • -lmylib: 指定要链接的库文件的名称(不包括前缀 lib 和后缀 .a)。
  1. 运行程序:使用以下命令运行程序:./myprogram
头文件守卫:防止头文件被重复包含
	#ifndef _HEAD_H_
	#define _HEAD_H_
......
	#endif
动态库制作及使用:
  1. 创建动态库 使用C或C++编写一个源文件,例如mylib.c或mylib.cpp,然后使用以下命令来编译它:
gcc -shared -o libmylib.so mylib.c

这会将源文件编译为一个名为libmylib.so的共享对象文件。该文件包含动态库中定义的函数和变量。

  1. 安装动态库 将生成的libmylib.so文件安装到系统中,以便其他程序可以使用它。可以使用以下命令来安装库文件:
sudo cp libmylib.so /usr/local/lib
sudo ldconfig

这将复制库文件到/usr/local/lib目录下,并使用ldconfig命令将其添加到系统共享库列表中。

  1. 使用动态库 在程序中使用动态库需要使用到它的头文件和链接库文件,可以使用以下命令来编译程序并链接动态库:
gcc -o myprogram myprogram.c -L/usr/local/lib -lmylib

这将生成名为myprogram的可执行文件,并使用libmylib.so动态库文件。
总之,在Linux中创建和使用动态库需要以下步骤:

  1. 编写源文件并将其编译为共享对象文件。
  2. 将共享对象文件安装到系统中。
  3. 在程序中使用头文件和链接库文件来链接动态库。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值