15-compilation_process

本文详细介绍了C语言从源代码到可执行程序的整个编译过程,包括预处理、编译、汇编及链接等关键步骤,并对比了静态链接与动态链接的不同之处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译预处理

被编译器隐藏的过程:
file.c + file.h ->
    预处理器cpp(删除注释,展开宏等) ->
    file.i ->
    编译器gcc ->
    file.S (汇编代码) ->
    汇编器as ->
    file.o ->
    连接器linker(链接libc.a lib.so等) ->
    file.out

预编译:
处理所有的注释,以空格代替;
将所有的#define删除,并且展开所有的宏定义;
处理条件编译指令#if,#ifdef,#elif,#else,#endif
处理#include,展开被包含的文件;
保留编译器需要使用的#pragma指令;

预处理指令:
    gcc -E file.c -o hello.i

编译:
对预处理文件进行一系列的词法分析,语法分析和语义分析;
    词法分析主要分析关键字,标示符,立即数等是否合法;
    语法分析主要分析表达式是否遵循语法规则;
    语义分析在语法分析的基础上进一步分析表达式是否合法;
分析结束后进行代码优化生成相应的汇编代码文件;

编译指令:
    gcc -S file.c -o hello.S


汇编:
汇编器将汇编代码转变为机器可以执行的指令
    每一条汇编语句几乎都对应一条机器指令;

汇编指令:
    gcc -C file.s -o hello.o


链接器
链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接;

静态链接
file1.o file2.o libc.a ->
    链接器linker ->
    a.out
a.out文件包含file1.o,file2.o,libc.a中所有的文件;
缺点是目标文件较大,优点是运行较快,可独立运行;

动态链接
file1.o lib1.so lib2.so ->
    链接器linker ->
    a.out
a.out中不包含lib1.so和lib2.so文件的内容,只是在加载的时候链接到so文件
优点是so文件可单独维护,编译目标文件较小;缺点是运行需要加载,速度略慢;

编译器将编译工作主要分为预处理,编译和汇编三部分;
链接器的工作是把各个独立的模块连接为可执行程序;
静态链接在编译期完成,动态链接在运行期完成;



pip install PyAudio DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 will remove support for this functionality. Defaulting to user installation because normal site-packages is not writeable Collecting PyAudio Downloading PyAudio-0.2.14.tar.gz (47 kB) |████████████████████████████████| 47 kB 28 kB/s Installing build dependencies ... done Getting requirements to build wheel ... done Preparing wheel metadata ... done Building wheels for collected packages: PyAudio Building wheel for PyAudio (PEP 517) ... error ERROR: Command errored out with exit status 1: command: /usr/bin/python /home/abot/.local/lib/python2.7/site-packages/pip/_vendor/pep517/_in_process.py build_wheel /tmp/tmpXvTLKr cwd: /tmp/pip-install-__KrI2/pyaudio Complete output (18 lines): running bdist_wheel running build running build_py creating build creating build/lib.linux-x86_64-2.7 creating build/lib.linux-x86_64-2.7/pyaudio copying src/pyaudio/__init__.py -> build/lib.linux-x86_64-2.7/pyaudio running build_ext building 'pyaudio._portaudio' extension creating build/temp.linux-x86_64-2.7 creating build/temp.linux-x86_64-2.7/src creating build/temp.linux-x86_64-2.7/src/pyaudio x86_64-linux-gnu-gcc -pthread -fno-strict-aliasing -Wdate-time -D_FORTIFY_SOURCE=2 -g -fdebug-prefix-map=/build/python2.7-D7NSzq/python2.7-2.7.17=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -I/usr/local/include -I/usr/include -I/usr/include/python2.7 -c src/pyaudio/main.c -o build/temp.linux-x86_64-2.7/src/pyaudio/main.o src/pyaudio/main.c:31:10: fatal error: portaudio.h: 没有那个文件或目录 #include "portaudio.h" ^~~~~~~~~~~~~ compilation terminated.
最新发布
07-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值