内容专栏: Linux操作系统基础
本文概括: 预处理、编译、汇编、链接、动静态库、gcc选项等。
本文作者: 阿四啊
发布时间:2023.9.13
- 预处理(进行宏替换)
- 编译(生成汇编)
- 汇编(生成机器可识别代码)
- 连接(生成可执行文件或库文件)
格式:gcc [选项] 要编译的文件 [选项] [目标文件]
gcc命令记忆技巧:ESc
(键盘左上角键) + iso
(镜像文件后缀)
gcc –E hello.c –o hello.i
gcc –S hello.i –o hello.s
gcc hello.o –o hello
libc.so.6
的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6
库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。[Asi@localhost ~]$ ldd mybin
linux-vdso.so.1 => (0x00007fff7e5e9000)
libc.so.6 => /lib64/libc.so.6 (0x00007f0c99260000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0c9962d000)
动态库
(动态链接):是C/C++或者其他第三方提供的所有方法的集合,被所有程序以链接的方式关联起来。所谓的动态链接,其实是将要链接的库中的函数地址拷贝到我们可执行程序的特定位置。
优点:形成的可执行程序小,有利于节省系统的开销。
缺点:强依赖性,动态库没了,那么,所有与动态库关联的程序都无法运行。
静态库
(静态链接):是C/C++或者其他第三方提供的所有方法的集合,被所有程序以拷贝的方式,将需要的代码,拷贝到自己的可执行程序中。
优点:可以独立运行,无需额外的库文件。
缺点:可执行文件大,导致磁盘空间的浪费。
⚠️注:默认情况下,XShell中是没有安装静态库的,只有动态库,如果要安装,执行以下命令:
C语言静态库
[Asi@localhost ~]$ sudo yum install -y glibc-static
C++静态库
[Asi@localhost ~]$ sudo yum install -y libstdc++-static
演示:
创建一个test.c
文件,写入一段C语言代码。
将test.c
文件动态链接(gcc编译器默认情况下链接的是动态库)取名为test-d
[Asi@localhost ~]$ gcc test.c -o test-d
再次将test.c
文件静态链接(需要添加-static选项)取名为test-s
[Asi@localhost ~]$ gcc test.c -o test-s -static
对比发现,动态链接后生成的可执行文件的大小与静态链接后生成的可执行文件大小相差了近百倍,所以gcc下为什么默认情况下生成动态链接库。
[Asi@localhost ~]$ ll
total 876
-rw-rw-r-- 1 Asi Asi 127 Sep 12 15:40 test.c
-rwxrwxr-x 1 Asi Asi 8480 Sep 13 15:47 test-d
-rwxrwxr-x 1 Asi Asi 861216 Sep 13 16:22 test-s