20181121_动态库

--------------------------------------------------------------------------------------------

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

猜你喜欢

转载自blog.csdn.net/qq_37718322/article/details/83589717