qfedu-c-level/day8/homework/h1
flykhan e8fdb609fe day8 homework: 动态库的生成和使用题目练习 2023-07-12 23:16:19 +08:00
..
includes day8 homework: 动态库的生成和使用题目练习 2023-07-12 23:16:19 +08:00
libs day8 homework: 动态库的生成和使用题目练习 2023-07-12 23:16:19 +08:00
tempfiles day8 homework: 动态库的生成和使用题目练习 2023-07-12 23:16:19 +08:00
README.md day8 homework: 动态库的生成和使用题目练习 2023-07-12 23:16:19 +08:00
testArrSort.c day8 homework: 动态库的生成和使用题目练习 2023-07-12 23:16:19 +08:00
testFactorial.c day8 homework: 动态库的生成和使用题目练习 2023-07-12 23:16:19 +08:00

README.md

#### 题目要求: 创建 a.h、a.c,、b.h、b.c 四个文件,在 a 文件中创建求阶乘函数并实现,在 b 文件中创建数组的排序函数并实现,要求将 a,b 编译成动态库文件。并编写 test.c 文件,引入 a 和 b 两个文件的功能并编译运行。

  1. libs 中包含使用 tempfiles 文件夹中的源代码生成的动态库
  2. includes 中包含 test*.c 需要用到的头文件

生成动态库

# 一般生成方式
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

关于 -fPIC 的问题: -fPIC 是 GCCGNU Compiler Collection编译器的一个选项用于生成位置无关代码Position Independent CodePIC

位置无关代码是一种机器代码,它可以在内存中的任意位置加载和执行,而不受具体加载地址的限制。这对于共享对象(动态链接库)非常重要,因为共享对象可以在内存中的不同地址加载,并被多个进程或程序共享使用。

使用 -fPIC 选项编译源代码时,编译器会生成适用于位置无关的目标文件。这些目标文件可以在后续的链接过程中用于创建共享对象。

通过使用 -fPIC编译器会使用一些技术来生成位置无关代码例如使用相对寻址relative addressing而不是绝对寻址absolute addressing以及使用全局偏移表Global Offset TableGOT等。

总之,-fPIC 选项告诉编译器生成位置无关代码,以便在创建共享对象时能够正确地进行链接和加载,避免出现链接错误。

编译时指定头文件可以使用

gcc testxxx.c ./libs/libxxx.so -I ./includes/ -o testxxx