linux编译so库
一、动态库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库相关推荐
- Linux编译soci库,Soci库linux下的编译方法
Soci库的linux编译方法 1.下载soci库源码 2.在目标机器上配置数据库环境 以oracle为例:(其他数据库只需要简单安装客户端即可) A)下载oracle客户端安装包 oracle-in ...
- live555 linux编译静态库,【Live555】liveMedia下载、配置、编译、安装、基本概念
一.下载.编译.安装 1.下载 官网地址:http://www.live555.com/ 下载地址:http://www.live555.com/liveMedia/public/ 2.配置. 源码目 ...
- linux编译静态库的头文件,条件编译,头文件,静态库,共享库与多文件编程
条件编译 条件编译即满足某些条件的时候编译某部分代码,常用于开发多个版本的程序,当满足条件A时,编译出免费版本的软件,当满足条件B时,编译除vip版本的软件,可以提高代码的复用率.条件编译使用&quo ...
- CMake从0到1:Linux编译动态库,调用动态库,VSCode单步执行
工欲善其事必先利其器,如果要想在Linux系统上编写C++代码,常常我们会有如下几个需求: 1.编译可执行文件 2.可执行文件调用动态库,这里通常包括两种情况:(1)自己的动态库,那就得先生成再链接: ...
- linux编译动态库未定义,GCC链接库的一个坑:动态库存在却提示未定义动态库的函数...
背景 在GCC中已经指定链接库,然而编译时却提示动态库函数未定义! 测试出现的错误提示如下: [GMPY@13:48 tmp]$gcc -o test -L. -lmylib test.c /tmp/ ...
- live555 linux编译静态库,ubuntu live555测试
1.首先你得有这个live555源码,然后根据你的系统去编译得到所需的头文件以及库,这里好像都是静态库. 这个是github上的代码. 链接: https://github.com/xanview/l ...
- linux编译动态库未定义,自定义动态库 对‘*’未定义的引用解决方法
自定义动态库 对'*'未定义的引用 本帖最后由 longruliang 于 2015-05-25 16:02:26 编辑 自己编写了一个串口方面的动态库,想写一个测试程序,在编译的时候冒出对'*'未定 ...
- linux 内核fpic,linux编译动态库 fPIC作用
标签: 在生成动态库时,常常习惯性的加上fPIC选项,fPIC有什么作用和意义,加不加有什么区别,这里做下小结: fPIC的全称是 Position Independent Code, 用于生成位置无 ...
- linux编译动态库之fPIC
转载:https://blog.csdn.net/sinc00/article/details/44833839 今天在用g++编译代码时,提示说.rdata错误,然后网上找了一堆资料,最后明白了一个 ...
- linux编译动态库之-fPIC
在生成动态库时,常常习惯性的加上fPIC选项,fPIC有什么作用和意义,加不加有什么区别,这里做下小结: fPIC的全称是 Position Independent Code, 用于生成位置无关代码. ...
最新文章
- oracle查询用户的概要文件,Oracle用户、概要文件、权限及角色实例
- Java 如何将String转化为Int
- 导入shape文件到SDE数据库
- 视频编解码器常见问题介绍
- SQLServer DBA 三十问(加强版)
- 【Elasticsearch】估算在 Elasticsearch 中存储文档的成本
- Vue + echart 实现中国地图 和 省市地图(可切换省份
- [PyTorch] 安装
- 做移动视频直播应用的思路
- ShapeContext
- 什么是表示学习(representation learning)表征学习 表达学习
- 科技爱好者周刊(第 202 期):三个有启发的学习方法
- 谈及区块链,我们脑海当中首先浮现出来的是,狂热、浮躁的场景
- 如何理解CRM软件里的销售机会与线索
- 关于建立北京市专业技术人员职业资格与职称对应关系的通知
- 独立成分分析 与 功能连接之间的关联尝试 by 张高燕
- FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'D:/tjn/tra
- 中软国际首届嘉年华晚会 创新网络年会PK“春晚”
- 锁定计算机算qq在线吗,看对方qq上只显示“在线”两个字,是不是对方就是电脑在线?不是手机在线...
- QM4_Probability