配置vim
bash
$ curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
gcc
gcc code.c
生成可执行文件,但是名称是a.out
gcc code.c -o code.exe
-o 意味着重命名
gcc -E code.c -o code.i
预处理为.i文件,并保存到code.i文件
为什么有条件编译这个功能?
例:软件的免费版和付费版
例:防止头文件被重复包含
c
#ifndef __CODE_H__
#define __CODE_H__
//code
#endif
gcc -S code.i -o code.s
从C语言文件翻译成为汇编语言
gcc -c code.s -o code.o
把编译语言翻译为二进制文件 (.o可重定位目标二进制文件)
gcc code.o -o code
进行链接,生成可执行文件
-ESc .iso
其它选项
gcc code.c -o code -Wall
(-warning all)
把编译过程中的报错全部打印显示
如何理解库
| 静态库 | 动态库 | |
|---|---|---|
| Linux | .a |
.so |
| Windows | .lib |
.dll |
Linux下的命名规则:libname.so |
||
| 真实名字是name | ||
例如libc-2.17.so是c标准库2.17版本 |
||
使用ldd命令查看依赖库 |
bash
$ ldd code.exe
linux-vdso.so.1 => (0x00007fff7d9a9000)
libc.so.6 => /lib64/libc.so.6 (0x00007fc2277eb000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc227bb9000)
什么是动静态库?
动态链接:链接的是关联关系,更改的地址是库地址
一旦库缺失,所有相关程序都无法运行!
把程序需要的库中的方法直接拷贝到程序中,叫做静态链接
| 动态库(共享库) | 静态库 | |
|---|---|---|
| 文件后缀 | .so |
.a |
| 链接方式 | 动态链接 | 静态链接 |
| 优点 | 节省内存空间 | 不需要库跳转;编译完成后不再依赖库 |
| 缺点 | 速度慢;编译完成后依旧依赖动态库 | 可执行程序体积较大,消耗内存资源 |
| 结论一:gcc编译默认采用动态链接 | ||
| 日常开发也推荐使用动态库和动态链接 |
bash
$ file code
code: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=9398bb16eaf5490d0c7b660b2f307da66a39cd3f, not stripped
如果想要使用静态链接:
- 需要安装静态库(默认没装)
- 使用
gcc code.c -o code -static
bash
-rwxrwxr-x 1 8440 Dec 14 16:38 code
-rw-rw-r-- 1 599 Dec 4 14:02 code.c
-rwxrwxr-x 1 861288 Dec 14 16:41 code-static
明显静态链接的体积更大
bash
$ file code
code: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=9398bb16eaf5490d0c7b660b2f307da66a39cd3f, not stripped
$ file code-static
code-static: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=86dde6cc4cb8144173b2edd95e56ab6207efdcb2, not stripped