一、动态库so的编译

以一个例子来说明。 这里有三个so_test.h, test_a.c, test_b.c

#ifndef _SO_TEST_H_
#define _SO_TEST_H_void test_a();
void test_b();
void test_c();#endif    /* _SO_TEST_H_ */
#include <stdio.h>
#include "so_test.h"void test_a()
{printf("this is in test_a \n");
}
#include <stdio.h>
#include "so_test.h"void test_b()
{printf("this is in test_b \n");
}

将这几个文件编译成一个动态库:libtest.so

gcc test_a.c test_b.c -fPIC -shared -o libtest.so

分析:-fPIC是位置无关码,-shared是按照共享库的方式来链接

二、动态库so的链接

例子: main.c 调用libtest.so库

#include <stdio.h>
#include "so_test.h"int main(void)
{test_a();test_c();test_b();return 0;
}

将main.c与动态库libtest.so链接生成执行文件main

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

分析:

-L参数:指明要链接的so库所在路径(如-L. 表示当前路径, -L../so 表示当前路径的上一层目录的so子文件夹中)

-l参数:指明要连接的库的名字,如-ltest 表示要链接libtest.so库

三、运行main

现象:运行出错,报错信息:

error while loading shared libraries: libaston.so: cannot open shared object file: No such file or directory

错误原因:在执行main程序的时候发现它动态链接了libtest.so,于是会去固定目录尝试加载libaston.so,如果加载失败则会打印以上错误信息。

系统加载so库的思路:

①首先到LD_LIBRARY_PATH这个环境变量所指定的目录下去寻找

①如果找不到,再去/usr/lib, /lib等专门存放库的目录下寻找

解决方法一:

将libtest.so放到固定目录下就可以了,这个固定目录一般是/usr/lib目录。(cp libtest.so /usr/lib即可)

解决方法二:

使用环境变量LD_LIBRARY_PATH。将libtest.so所在目录导出到LD_LIBRARY_PATH即可。

如:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/hgfs/winshare/so_test

补充:ldd命令

作用:查看一个可执行程序使用了哪些共享库,并且这些共享库是否能被找到,能被解析。

如:ldd main,得到:

        linux-gate.so.1 =>  (0xb776f000)libtest.so => /usr/lib/libtest.so (0xb7754000)libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75a3000)/lib/ld-linux.so.2 (0xb7770000)

linux编译so库相关推荐

  1. Linux编译soci库,Soci库linux下的编译方法

    Soci库的linux编译方法 1.下载soci库源码 2.在目标机器上配置数据库环境 以oracle为例:(其他数据库只需要简单安装客户端即可) A)下载oracle客户端安装包 oracle-in ...

  2. live555 linux编译静态库,【Live555】liveMedia下载、配置、编译、安装、基本概念

    一.下载.编译.安装 1.下载 官网地址:http://www.live555.com/ 下载地址:http://www.live555.com/liveMedia/public/ 2.配置. 源码目 ...

  3. linux编译静态库的头文件,条件编译,头文件,静态库,共享库与多文件编程

    条件编译 条件编译即满足某些条件的时候编译某部分代码,常用于开发多个版本的程序,当满足条件A时,编译出免费版本的软件,当满足条件B时,编译除vip版本的软件,可以提高代码的复用率.条件编译使用&quo ...

  4. CMake从0到1:Linux编译动态库,调用动态库,VSCode单步执行

    工欲善其事必先利其器,如果要想在Linux系统上编写C++代码,常常我们会有如下几个需求: 1.编译可执行文件 2.可执行文件调用动态库,这里通常包括两种情况:(1)自己的动态库,那就得先生成再链接: ...

  5. linux编译动态库未定义,GCC链接库的一个坑:动态库存在却提示未定义动态库的函数...

    背景 在GCC中已经指定链接库,然而编译时却提示动态库函数未定义! 测试出现的错误提示如下: [GMPY@13:48 tmp]$gcc -o test -L. -lmylib test.c /tmp/ ...

  6. live555 linux编译静态库,ubuntu live555测试

    1.首先你得有这个live555源码,然后根据你的系统去编译得到所需的头文件以及库,这里好像都是静态库. 这个是github上的代码. 链接: https://github.com/xanview/l ...

  7. linux编译动态库未定义,自定义动态库 对‘*’未定义的引用解决方法

    自定义动态库 对'*'未定义的引用 本帖最后由 longruliang 于 2015-05-25 16:02:26 编辑 自己编写了一个串口方面的动态库,想写一个测试程序,在编译的时候冒出对'*'未定 ...

  8. linux 内核fpic,linux编译动态库 fPIC作用

    标签: 在生成动态库时,常常习惯性的加上fPIC选项,fPIC有什么作用和意义,加不加有什么区别,这里做下小结: fPIC的全称是 Position Independent Code, 用于生成位置无 ...

  9. linux编译动态库之fPIC

    转载:https://blog.csdn.net/sinc00/article/details/44833839 今天在用g++编译代码时,提示说.rdata错误,然后网上找了一堆资料,最后明白了一个 ...

  10. linux编译动态库之-fPIC

    在生成动态库时,常常习惯性的加上fPIC选项,fPIC有什么作用和意义,加不加有什么区别,这里做下小结: fPIC的全称是 Position Independent Code, 用于生成位置无关代码. ...

最新文章

  1. oracle查询用户的概要文件,Oracle用户、概要文件、权限及角色实例
  2. Java 如何将String转化为Int
  3. 导入shape文件到SDE数据库
  4. 视频编解码器常见问题介绍
  5. SQLServer DBA 三十问(加强版)
  6. 【Elasticsearch】估算在 Elasticsearch 中存储文档的成本
  7. Vue + echart 实现中国地图 和 省市地图(可切换省份
  8. [PyTorch] 安装
  9. 做移动视频直播应用的思路
  10. ShapeContext
  11. 什么是表示学习(representation learning)表征学习 表达学习
  12. 科技爱好者周刊(第 202 期):三个有启发的学习方法
  13. 谈及区块链,我们脑海当中首先浮现出来的是,狂热、浮躁的场景
  14. 如何理解CRM软件里的销售机会与线索
  15. 关于建立北京市专业技术人员职业资格与职称对应关系的通知
  16. 独立成分分析 与 功能连接之间的关联尝试 by 张高燕
  17. FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'D:/tjn/tra
  18. 中软国际首届嘉年华晚会 创新网络年会PK“春晚”
  19. 锁定计算机算qq在线吗,看对方qq上只显示“在线”两个字,是不是对方就是电脑在线?不是手机在线...
  20. QM4_Probability

热门文章

  1. AllenNLP 用法总结
  2. SiamFC 文章阅读
  3. 闭合附和导线近似平差 ∈ C# 编程笔记
  4. #边学边记 必修4 高项:对事的管理 第六章 项目质量管理 质量管理基础
  5. Matlab之聚类分析
  6. 科立捷默认频率_TETRA对讲机简介
  7. 傅里叶变换落地:离散傅里叶变换(DFT)
  8. 三茗硬盘保护系统安装Linux,重装windows系统而不影响linux引导的方法
  9. Unity3D游戏开发学习线路图附全套视频教程2019最新版
  10. Linux系统安装Oracle 10g