--------------------------------------------------------------------------------------------
main.c
#include<<font color="#ffc20e">stdio.h>
int main(voud)
{
hello();
return 0;
}
--------------------------------------------------------------------------------------------
hello.c
#include<<font color="#ffc20e">stdio.h>
void world(void);
void hello(void)
{
printf("hello ");
world();
}
--------------------------------------------------------------------------------------------
world.c
#include<<font color="#ffc20e">stdio.h>
void world(void)
{
printf("world \n ");
}
--------------------------------------------------------------------------------------------
Makefile
all:
#生成.o文件 -fPIC 告诉编译器这个动态库与位置无关
gcc -fPIC -c world.c hello.c
#根据.o文件生成 动态库 -shall 生成动态库 lib开头.so结尾
gcc -shared -o libworld.so world.o
#如果这个动态库有依赖其他动态库的必须指定动态库位置 .
gcc -shared -o libhello.so hello.o -lworld -L ./
#根据动态库生编译 -lhello指定libhello.so动态库 -L指定动态库.so文件所在目录
gcc -o haohao main.c -lhello -L ./ -Wl,-rpath=./
.PHONY: clean
clean:
rm *.o *.so haohao
--------------------------------------------------------------------------------------------
动态库制作:
gcc -fPIC -c world.c //生成.o文件
gcc -shared -o libworld.so world.o //根据.o文件生成动态库
lld libhaohao.so
查看该动态库的依赖关系
-c
编译不连接,生成world.o文件
-fPIC Position-Independent Code
作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有
绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。
这正是共享 库所要求的,共享库被加载时,在内存的位置不是固定的。
-Wl,-rpath=./ 的作用
程序运行时默认到环境变量LD_LIBRARY_PATH目录下去找动态库,如果动态库的目录没有添加到
LD_LIBRARY_PATH中则需要用-rpath 指定
-rpath和-L不同 -L是为链接的时候指定动态库 -rpath是为程序运行指定动态库
-Wl选项告诉编译器将后面的参数传递给链接器。
很好的动态库解释
https://blog.csdn.net/Q1302182594/article/details/42102961