一、C语言的编译过依次执行了四步操作:
https://blog.youkuaiyun.com/wwxy1995/article/details/107869010
https://zhuanlan.zhihu.com/p/88255667
https://blog.youkuaiyun.com/weixin_41143631/article/details/81221777
incldu和链接(link):https://www.zhihu.com/question/389126944
1.预处理
预处理(Preprocessing):预处理器(cpp)根据以字符#开头的命令,修改原始的C程序。比如hello.c中第一行的#include<stdio.h>命令告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入程序文本中,结果就得到了另一个C程序,通常是以.i作为文件扩展名。
2.编译
编译(Compilation):编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式确切的描述了一条低级机器语言指令汇编代码(assembly code)。
3.汇编
汇编(Assemble):汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成一种可重定位目标程序的格式,并将结果保存在目标文件hello.o中。hello.o文件是一个二进制文件,即机器码(machine code),它的字节编码是机器语言指令而不是字符,如果我们在文本文件中打开hello.o文件,看到的将是一堆乱码。
4.链接:
链接(Linking):链接器(ld)负责处理合并目标代码。链接过程将多个目标文以及所需的库文件(.so等)链接成最终的可执行文件(executable file)。可以被加载到内存中,由系统执行。
https://www.cnblogs.com/elwinch/articles/2201091.html
二、.c .cc .cpp 和 .h .hpp .inl 这些后缀名都有什么区别
1.C中:头文件后缀名 .h, 源文件后缀名 .c
2.C++ 中: 头文件后缀名 .h .hpp .hxx ,源文件后缀名为: .cpp .cc .cxx
3. .h和.hpp 的区别: .h 里面只有声明,没有实现; 而 .hpp 里面既有声明也有实现,后者可以减少 .cpp 数量,适合用来编写公用的开源库
4.inl 文件是 内联函数的源文件,内联函数通常在 C++头文件中实现,但有的时候,内联函数较多或者出于一些别的考虑(比如:头文件看起来更加简洁)往往会将这部分具体定义的代码添加到 INL文件中,然后在该头文件的末尾将其用 #include 引入。 由此也可以看到 inl 文件的一个用法影子 ------模板函数,模板类的定义的代码的存放。
三、gcc 和g++ 区别
1.简单来说:gcc 和g++都是 GNU组织的一个编译器,都可以编译C代码与 C++代码。但是,后缀为 .c的, gcc 把它当做 C程序,而g++当做 C++程序;后缀为 .cpp 的,两者都会认为是 C++程序。
2.编译阶段:g++会调用gcc ,对于C++代码,两者等价。但是因为gcc 命令不能自动和C++程序使用的库联接,所以通常使用 g++来完成链接
3.gcc 编译cpp 可以使用命令: gcc main.cpp -lstdc++
GCC基本使用:https://zhuanlan.zhihu.com/p/404682058
四、静态链接,动态链接具体做了什么
1.静态链接是在形成可执行程序前,而动态链接的进行则是在程序执行时链接
2.静态链接浪费空间,这是由于多进程情况下,每个进程都要保持静态链接函数的副本,更新困难,当链接的众多目标文件有一个改变后,整个程序都要重新链接才能使用新的版本,但是静态链接运行效率高。
3.动态链接当系统多次使用同一个目标文件时,只需要加载一次即可,节省内存空间,程序升级变得容易,当升级某个共享模块时,只需要简单的将旧目标文件替换掉,程序下次运行时,新版目标文件会被自动装载到内存并链接起来,即完成升级
4.静态链接时以目标文件为单位,将各个目标文件连接起来形成可执行文件
5.动态链接的基本思想是把程序按照模块拆分成各个相对独立部分,在程序运行时才将他们链接在一起形成一个完成的程序,而不是像静态链接一样把所有程序模块都链接成一个单独的可执行文件。
二~四内容引用自: https://blog.youkuaiyun.com/u013620306/article/details/128668525
五、Linux依赖库路径(编译以及时)
https://onesea.blog.youkuaiyun.com/article/details/42102961?spm=1001.2101.3001.6650.6&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6-42102961-blog-78552294.235%5Ev43%5Epc_blog_bottom_relevance_base1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-6-42102961-blog-78552294.235%5Ev43%5Epc_blog_bottom_relevance_base1&utm_relevant_index=13
-rpath、-rpath-link、LD_LIBRARY_PATH三个变量/参数的生效时机总结如下: