但是我们在编译时又找不到头文件了所以我们需要使用已下命令:

g++ usercode.c -o -I ./lib/include/ -L ./lib/mylib/ -l myc

系统默认头文件位置:/user/lib

系统默认库文件位置:/lib64

动态库

动态库和静态库的原理基本一致

但是在编译中,需要:

g++ *.c -fPIC -c *.o

gcc *.o -o libmyc.so

当动静库同时存在时,g++默认使用动态,如果非要使用静态库(-static)

vs 上可以直接形成动静态库

目标文件

编译和链接这两个步骤,在windows下被我们的ide封装的很完美,我们一般都是一键构建非常方便,但一旦遇到,错误的时候呢,尤其是链接相关的借误,很多人就束手无策了。

.o/.obj:可重定位目标文件

当更改一个文件时不需要全部编译

ELF文件

可执行程序和动静态库都是ELF格式的

可重定位⽂件(Relocatable File) :

即 xxx.o ⽂件。包含适合于与其他⽬标⽂件链接来创建可执⾏⽂件或者共享⽬标⽂件的代码和数据。

• 可执⾏⽂件(Executable File) :即可执⾏程序。

• 共享⽬标⽂件(Shared Object File) :即 xxx.so⽂件。

• 内核转储(core dumps) ,存放当前进程的执⾏上下⽂,⽤于dump信号触发。 ⼀个ELF⽂件由以下四部分组成:

• ELF头(ELF header) :描述⽂件的主要特性。其位于⽂件的开始位置,它的主要⽬的是定位⽂件的其他部分。

• 程序头表(Program header table) :列举了所有有效的段(segments)和他们的属性。表⾥记着每个段的开始的位置和位移(offset)、⻓度,毕竟这些段,都是紧密的放在⼆进制⽂件中,需要段表的描述信息,才能把他们每个段分割开。• 节头表(Section header table) :包含对节(sections)的描述。

• 节(Section ):ELF⽂件中的基本组成单位,包含了特定类型的数据。ELF⽂件的各种信息和数据都存储在不同的节中,如代码节存储了可执⾏代码,数据节存储了全局变量和静态数据等。
从ELF形成可执行:

1.将多份c/c++代码,翻译成为目标文件.o+动静态库ELF

2.将多份.o文件section进行合并

如有错误欢迎评论区指出