代码改变世界

linux环境下的链接库编译

2020-02-17 21:53  xplorerthik  阅读(272)  评论(0编辑  收藏  举报

 

 https://blog.csdn.net/shaosunrise/article/details/79968921

有4个文件,test1.c  包含了 print。h, test2.c 包含了sum。h

 

 

 

 经过gcc -c  test1.c   test2.c 后,将2个源文件test1.c ,test2.c 编译成 .o 文件

 

然后开始生成a库(注意:链接库前缀必须以lib开头),指令如下:ar rcs libtest.a test1.o test2.o

 

 得到libtest.a库文件后,然后将.a库链接到主程序中,写主程序main.c和头文件main.h 。

 

 加载a库,生成可执行文件并执行,指令如下:gcc main.c -L. -ltest -o testEXE

 

 

生成动态库:

 

 so库的前缀必须为lib,然后将.so库链接到主程序main.c中,这里需要注意一下,因为动态库的特性,编译器会到指定的目录去寻找动态库,目录的地址在/etc/ld.so.conf.d/ 目录里的libc.conf文件里

方法2 还可以将so库复制到默认的目录下。这里是将so库复制到了默认目录下,生成可执行文件并运行,指令如下:

 sudo cp libtest.so  /usr/lib/

gcc main.c -L. -ltest -o mainExe

这样就生成了可执行的mainExe可执行文件  。 可直接运行 ./mainExe   

 c主程序文件main.c 调用这些程序(test1.c test2.c)的函数接口是可以使用a库或so库。

在主程序中只需要include含有库中提供的函数(print(),sum() )接口声明的头文件即可

在加载动态链接库的时候,有可能会遇到加载不到的错误,原因在于系统默认加载的动态链接库路径里没有找到你的动态库,有三种解决方法:

1.在执行gcc main.c -L. -ltest -o main 前,执行 export LD_LIBRARY_PATH=$(pwd)

2.将你so所在的目录写到/etc/ld.so.conf文件里,然后执行ldconfig。

3.将你的so放在/etc/ld.so.conf里的路径位置里。