qfedu-c-level/day8/homework/h1/README.md

33 lines
2.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 题目要求: 创建 a.h、a.c,、b.h、b.c 四个文件,在 a 文件中创建求阶乘函数并实现,在 b 文件中创建数组的排序函数并实现,要求将 a,b 编译成动态库文件。并编写 test.c 文件,引入 a 和 b 两个文件的功能并编译运行。
> 1. `libs` 中包含使用 `tempfiles` 文件夹中的源代码生成的动态库
> 2. `includes` 中包含 `test*.c` 需要用到的头文件
### 生成动态库
```bash
# 一般生成方式
gcc -shared a.c -o liba.so
# 如果碰到 /usr/bin/ld: /tmp/ccojI2tR.o: relocation R_X86_64_PC32 against symbol `factorial' can not be used when making a shared object; recompile with -fPIC , 可以使用如下命令
gcc -c -fPIC source_file.c -o object_file.o
gcc -shared object_file.o -o libshared_object.so
```
> <font color=red>关于 -fPIC 的问题</font>
> `-fPIC` 是 GCCGNU Compiler Collection编译器的一个选项用于生成位置无关代码Position Independent CodePIC
>
> 位置无关代码是一种机器代码,它可以在内存中的任意位置加载和执行,而不受具体加载地址的限制。这对于共享对象(动态链接库)非常重要,因为共享对象可以在内存中的不同地址加载,并被多个进程或程序共享使用。
>
> 使用 `-fPIC` 选项编译源代码时,编译器会生成适用于位置无关的目标文件。这些目标文件可以在后续的链接过程中用于创建共享对象。
>
> 通过使用 `-fPIC`编译器会使用一些技术来生成位置无关代码例如使用相对寻址relative addressing而不是绝对寻址absolute addressing以及使用全局偏移表Global Offset TableGOT等。
>
> 总之,`-fPIC` 选项告诉编译器生成位置无关代码,以便在创建共享对象时能够正确地进行链接和加载,避免出现链接错误。
### 编译时指定头文件可以使用
```bash
gcc testxxx.c ./libs/libxxx.so -I ./includes/ -o testxxx
```