比方说,我有以下程序(hello.c
):链接文件/头
#include <stdio.h>
#include <math.h>
#define NAME "ashoka"
int main(int argc, char *argv[])
{
printf("Hello, world! My name is %s\n", NAME);
}
所以,按照我的理解编译这一计划的过程是:
预处理:将复制粘贴stdio.h和math.h函数声明并替换
NAME
与"ashoka"
。clang -E hello.c
编译:将转向c代码到组件代码
clang -S hello.c
文件制备:hello.s
组装:变换组件代码对象代码生成
clang -c hello.s
文件:hello.o
链接:结合对象文件合并成一个文件,我们将执行。
clang hello.o -lm
OR(比方说,我也想链接hello2.o)
clang hello.o hello2.o
所以,来到这里的问题:
是过程描述了正确的一个?
在链接阶段,我们链接在一起
.o
(Object code)文件。我知道math.h
驻留在/usr/include
目录中。math.o
在哪里?链接器如何找到它?什么是
.a
在Linux下(静态库)和.so
(动态库)?他们如何与.o
文件和链接阶段相关?比方说,我想分享我与世界上的一个图书馆。我有一个
mylib.c
文件,其中我已经声明并实现了我的功能。我将如何去分享这个,以便人们通过执行#include <mylib.h>
或#include "mylib.h"
将它包含在他们的项目中?
由于没有关闭,你的代码会发出编译错误 – MikeCAT
@MikeCat thx。编辑。 – padawanTony
谢谢大家的回答。我也会在完成一些研究后创建一个关于问题4的新帖子。 – padawanTony