1、动态库的编译

下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:test.h,三个.c文件:t1.c、t2.c、t2.c,我们将这几个文件编译成一个动态库:libtest.so。
//test.h:
#include “stdio.h”
void t1();
void t2();
void t3();
//t1.c:
#include “test.h”
void t1()
{
printf(“t1…\n”);
}
//t2.c:
#include “test.h”
void t2()
{
printf(“t2…\n”);
}
//t3.c:
#include “test.h”
void t3()
{
printf(“t3…\n”);
}
将这几个文件编译成一个动态库:libtest.so
$ gcc t1.c t2.c t3.c -fPIC -shared -o libtest.so

2、动态库的链接

在1、中,我们已经成功生成了一个自己的动态链接库libtest.so,下面我们通过一个程序来调用这个库里的函数。程序的源文件为:main.c。
main.c:
#include “test.h”
int main()
{
t1();
t2();
t3();
return 0;
}
将main.c与动态库libtest.so链接生成执行文件main:
$ gcc main.c -L. -ltest -o main
测试是否动态连接,如果列出libtest.so,那么应该是连接正常了
$ ldd main
执行test,可以看到它是如何调用动态库中的函数的。
注意,这里可能会出现找不到动态库的情况
报错: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
这是因为没有设置动态库的环境变量,也就是第四点说的,你需要将刚刚编译的动态库的目录添加到环境变量里面。例如临时添加:export LD_LIBRARY_PATH=/usr/my_test:$LD_LIBRARY_PATH
这种添加关闭终端以后就失效。
永久添加,需要更新bashrc文件。如4所说,
export LD_LIBRARY_PATH=/usr/my_test: $LD_LIBRARY_PATH。

有一点需要说明的是,上面的时候设置动态库的环境变量,
还有很多时候我们在做交叉编译的时候或者安装其他软件的时候,
需要对路径做环境变量的导出,PATH,
它的用途就是当用户要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下寻找此程序外,还要到PATH变量中指定的路径去寻找。
写法是:export PATH=/usr/mytest:$PATH

另外,.bahshrc是在home目录下的,编辑指令为:vim ~/.bashrc,立即生效指令为soource ~/.bashrc

上面更改bashrc为单个用户,全部用户则需要修改/etc/profile 文件是系统为每个用户设置的环境信息,当用户第一次登录时,该文件被执行。此文件的改变会涉及到系统的环境,也就是有关Linux环境变量的东西。
修改方式一样,立即生效:source /etc/profile

3、编译参数解析

最主要的是GCC命令行的一个选项:
-shared该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件

-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

-L.:表示要连接的库在当前目录中

-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称

LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。

当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。

4、注意

调用动态库的时候有几个问题会经常碰到,有时,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过 “-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的so文件,这时你要作的就是通过修改 LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。

在linux下可以用export命令来设置这个值,在linux终端下输入:
export LD_LIBRARY_PATH=/opt/au1200_rm/build_tools/bin: $LD_LIBRARY_PATH: 然后再输入:export
即会显示是否设置正确 export方式在重启后失效,所以也可以用 vim /etc/bashrc ,

修改其中的LD_LIBRARY_PATH变量。   
例如:LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/au1200_rm/build_tools/bin。

原文链接:https://blog.csdn.net/wlr_tang/article/details/53766783

so动态库生成、链接方法相关推荐

  1. Gcc详解以及静态库、动态库生成

    [转] Gcc详解以及静态库.动态库生成 http://www.360doc.com/content/10/0619/14/1795182_33985297.shtml 1.gcc包含的c/c++编译 ...

  2. QT 静态库和动态库的使用方法

    QT 静态库和动态库的使用方法 背景知识:程序在编译成可执行文件时,会有四步过程: 1预处理(头文件和宏定义) g++ -E 1.cpp -o 1.i 2编译 将c代码编译成汇编代码 g++ -S 1 ...

  3. linux动态库路径生效,Linux下如何解决动态库的链接问题

    原标题:Linux下如何解决动态库的链接问题 静态库是一种以空间换取时间和移植性的做法,一些情况下确实有着一定的意义,但是一些情况下,我们自己编写的简单项目,在绝大多数的机器上不存在移植性问题,是没有 ...

  4. linux直接运行程序加载动态库失败,扣丁学堂Linux培训详解程序运行时加载动态库失败解决方法...

    今天扣丁学堂Linux培训老师给大家介绍一下关于Linux程序运行时加载动态库失败的解决方法,希望对同学们学习有所帮助,下面我们一起来看一下吧. Linux下不能加载动态库问题 当出现下边异常情况 . ...

  5. postgresql源码学习(57)—— pg中的四种动态库加载方法

    一. 基础知识 1. 什么是库 库其实就是一些通用代码,可以在程序中重复使用,比如一些数学函数,可以不需要自己编写,直接调用相关函数即可实现,避免重复造轮子. 在linux中,支持两种类型的库: 1. ...

  6. 【错误记录】NDK 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | Android Studio 配置外部 so 动态库两种方法 )

    文章目录 一.报错信息 二.解决方案 ( Android Studio 配置外部 so 动态库两种方法 ) 1.jniLibs 目录存放 2.libs 目录存放 一.报错信息 外部引用 so 动态库 ...

  7. g++编译后运行时无法链接动态库的解决方法

    问题发现: $ g++ -Wall -o hellobrowser.exec hellobrowser.c -I/usr/local/include -L/usr/local/lib -lmicroh ...

  8. iOS中创建动态库及调用方法

    去年因需要用到动态库,自己就找了好多一些 资料,最终找到了一套方法,怎么创建与使用动态库,记录一下: Xcode提供了在iOS工程中创建静态库的功能,和在MAC上创建动态库和静态库的功能. 但是没有提 ...

  9. Qt 调用CUDA静态库和动态库生成与配置

    前言 通过将CUDA相关计算操作放在库中,方便在项目中调用,省去了每次编译cu文件的麻烦,也便于集成到其他平台上. 关于部署CUDA加速的程序时,往往对CUDA加速的程序编译为动态链接库或者静态链接库 ...

最新文章

  1. 设计模式之笔记--装饰模式(Decorator)
  2. win8下Python学习——搭建web.py框架
  3. 分布式系统,本文引用“courage”的博客
  4. 【云隐】STM32F103C8T6实现串口IAP方式升级固件
  5. 对应chd5.14的spark_GitHub - shixiaopengql/BigData-News: 基于Spark2.2新闻网大数据实时系统项目...
  6. Java之品优购部署_day03(6)
  7. 互联网通用架构技术----缓存雪崩
  8. matlab将二值图像与原图重叠_图像处理matlab及图像融合图像镶嵌图像拼接
  9. python处理报错_python3报错及解决方案/须注意的细节(持续更新)
  10. R及RStudio下载安装教程(超详细)
  11. 黑苹果教程 欸嘿嘿~
  12. D - 一只小蜜蜂...
  13. http //t cn/xx 等链接的生成与还原
  14. 字符串转成正则表达式
  15. 为 Macbook Pro 选择外接键盘
  16. 互联网巨头入局汽车后市场,VIN码识别迎利好
  17. 【云原生之Docker实战】使用Docker部署File Manager文件管理系统
  18. Android 轻松实现百度地图定位
  19. 基于Simulink的自适应模糊控制器.
  20. 可可西里观后感(转)-保护藏羚羊

热门文章

  1. 《学术研究,你的成功之路》阅读笔记
  2. _pickle.UnpicklingError: pickle data was truncated
  3. oracle账户登录中用户名是啥,Oracle用户名详解
  4. UITextField leftView 光标的边距 监听return键 字符长度的限制 以及其他的常用方法
  5. 微软股价创14年新高
  6. 把一元硬币换成1分,2分5分的硬币有几种不同的方法
  7. uniapp代驾+顺风车+货运三合一源码分享
  8. Java实现 LeetCode 127 单词接龙
  9. 软件测试工程师的岗位职责
  10. 群落生态学的 α-、β-、γ-多样性