linux下动态库的编写和调用

linux下动态库的编写和调用

  linux下编写和调用一个简单的动态库大概分为以下几个步骤:

  • 创建动态库程序文件
    add.c
int add(int a,int b)
{
    return a+b;
}
  • 创建引用头文件
    head.c
#ifndef _HEAD_
#define _HEAD_

int add(int a,int b);


#endif
  • 生成目标文件
    生成要加编译器选项 -fpic
gcc -fpic  -c  add.c
  • 然后生成动态库
    注意使用链接器选项 -shared
gcc  -shared –o  libhead.so  add.o
  • 编写主程序进行调用
    main.c
#include <stdio.h>
#include "head.h"

int main(void)
{
    printf("3+5 sum = %d \n",add(3,5));
    return 0;
}
  • 生成可执行文件并链接库文件
    编译程序时,使用动态链接库和静态库是一致的,使用”-l库名”的方式。
 gcc -o  main  main.c -L  ./  -lhead

  -L指定动态链接库的路劲,-ldXX链接库函数XX。-lXX是动态库的调用规则。Linux系统下的动态库命名方式是lib*.so,而在链接时表示位-l*,*是自己命名的库名。

  • 报错解决
error while loading shared libraries: libhead.so:  cannot open shared object file: No such file or directory

  这是因为程序运行时没有找到动态链接库的原因,注意linux不会自动在当前目录查找动态库文件。解决方案一般有三种,借鉴博客园SmartVessel原文:

(1.) 用ln将需要的so文件链接到/usr/lib或者/lib这两个默认的目录下边

ln -s /home/用户名/code/lib/*.so  /usr/lib
sudo ldconfig

  注意填写你的动态库所在目录的路径,若不知道可以用pwd查看全路径。如果路径不对,可能会报错:

cannot open shared object file: Error 40

(2.) 修改LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/home/用户名/code/lib/:$LD_LIBRARY_PATH
sudo ldconfig

(3.) 修改/etc/ld.so.conf,然后刷新

vim /etc/ld.so.conf

add /home/用户名/code/lib/
sudo ldconfig

  必须记得更新sudo ldconfig,否则还是会报错。

  • 运行测试
./main 3+5 sum = 8

  好啦,测试成功,有问题可以留言讨论!

版权声明:本文为csdn博主[applebite](http://blog.csdn.net/applebite) 原创文章,转载请注明出处,侵权必究。 微信添加公众号:qi_chuang 或 猎奇创新平台

你可能感兴趣的:(linux,动态库)