共享库的使用(.so)文件

 

1、共享库的概念

2、创建共享库命令

# 1、将.c生成.o文件,(生成与位置无关的代码-fPIC)
gcc -c add.c -o add.o -fPIC

# 2、使用 gcc -shared 制作动态库
gcc -shared lib库名.so add.o sub.o div.o

# 3、编译可执行程序时,指定所使用的动态库。-l: 指定库名 -L: 指定库路径
gcc test.c -o a.out -l mymath -L ./lib

4.运行可以执行程序 ./a.out 出错!!!
原因 连接器 工作于链接阶段,工作时需要 -l 和 -L
动态连接器 工作于程序运行阶段,工作时需要提供动态库所在目录位置

5、解决:把动态库配置到环境变量中 (建议使用绝对路径)
export LD_LIBRARY_PATH=./lib

报错了:在加载动态库的时候出错了,库名叫 libmymath.so,不能打开共享文件,没有这个文件或者目录

2、把动态库配置到环境变量中

1
gcc -shared -fpci -o lib/libmath.so obj/mymath.o

具体加不加 fpci 这个要看平台支持吧支持;具体详情可以查阅 shared的相关参数文档

这里有一个-fPIC参数
PIC就是position independent code
PIC使.so文件的代码段变为真正意义上的共享
如果不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位, 重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样,取决于 这个.so文件代码段和数据段内存映射的位置.

3、使用共享库命令

1
2
3
4
5
daokr@ubuntu:/mnt/hgfs/mystudy/clession$ gcc -shared -o lib/libmymath.so obj/mymath.o
daokr@ubuntu:/mnt/hgfs/mystudy/clession$ gcc -o bin/mymath_test2008 obj/mymath_test.o -Llib -lmymath
daokr@ubuntu:/mnt/hgfs/mystudy/clession$ ./bin/mymath_test2008
./bin/mymath_test2008: error while loading shared libraries: libmymath.so: cannot open shared object file: No such file or directory
daokr@ubuntu:/mnt/hgfs/mystudy/clession$<br>daokr@ubuntu:/mnt/hgfs/mystudy/clession$ sudo cp lib/libmymath.so /usr/lib<br>daokr@ubuntu:/mnt/hgfs/mystudy/clession$ ./bin/mymath_test2008<br>

注意:  

这样中直接回报错;说是不能够去打开这个共享库文件;两种方式解决这个错误

1)cp libmymath.so /usr/lib (需要root用户)

2)export LD_LIBRARY_PATH=库文件的目录 (这个是临时的;在开个窗口就没啥用了;执行的

1
./bin/mymath_test2008 不会被执行

 
 

mymath.so共享库的更多相关文章

  1. 共享库的使用(.so)文件

    1.共享库的概念 2.创建共享库命令 gcc -shared -fpci -o lib/libmath.so obj/mymath.o 具体加不加 fpci 这个要看平台支持吧支持:具体详情可以查阅 ...

  2. 链接(extern、static关键词\头文件\静态库\共享库)

    原文链接:http://www.orlion.ga/781/ 一. 多目标文件的链接 假设有两个文件:stack.c: /* stack.c */ char stack[512]; int top = ...

  3. linux下共享库的注意点之-fpic

    在编译共享库必须加上-fpic.这是为什么呢? 首先看一个简单的例子: #include <stdio.h> int fun1() { printf("fun1\n") ...

  4. 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  5. QT共享库的创建与调用(初级)(附:UI界面不能被改变的其中一个原因)

    背景: 最近在做的一个项目其中一部分既是实现PC与下位机的USB通信.windows平台下已经完成,现需移植到linux平台下. 在linux系统中,通过一段时间的工作,设备已被配置成hid类(后续再 ...

  6. ndk学习9: 动态使用共享库

    动态使用共享库函数 dll_main      环境介绍 续上节代码 目录结构:   android.mk如下: LOCAL_PATH := $(call my-dir) include $(CLEA ...

  7. linux共享库

    linux共享库 linux中共享库一般以.so.x.y.z 命名,其中x,y,z分别为主版本号.次版本号.发布版本号.同一个库,主版本号不同则相互不兼容:主版本相同,次版本号高的库比次版本号低的库有 ...

  8. linux C++ 共享库导出类

    1.共享库的对外接口函数的声明必须加上extern “C”. 2.使用共享库对话接口函数生成的对象指针时在该对象未被释放之前不能关闭共享库句柄,否则会出现segmentation fault错误. 以 ...

  9. 【转载】Linux下动态共享库加载时的搜索路径详解

    转载自:http://www.eefocus.com/article/09-04/71617s.html 对动态库的实际应用还不太熟悉的读者可能曾经遇到过类似“error while loading ...

  10. Linux 下编译安装软件,找不到共享库 xx.so 的解决办法

    编译memcached时,报错没有libevent,于是下载libevent,configure , make && make install ,然后在重新安装memcache成功之后 ...

随机推荐

  1. Codeforces Round #781 (Div. 2) - D. GCD Guess

    GCD + 位运算 [Problem - 1665D - Codeforces](https://codeforces.com/problemset/problem/1627/D) 题意 交互题,有一 ...

  2. drf从入门到飞升仙界 05

    反序列化类校验部分源码解析 # 反序列化校验,什么时候开始执行校验 视图类中的ser.is_valid(),就会执行校验,校验通过返回True,不通过返回false # 反序列化类校验的入口: ser ...

  3. crontab执行不生效

    背景:不知道什么原因脚本手动执行:正常:crontab执行不生效: 1.将命令所属路径加入到 /etc/crontab中, 2.在shell脚本中加入 source /etc/profile

  4. Java方法之可变参数

    可变参数[不定项] JDK 1.5开始,Java支持传递同类型的可变参数给一个方法. 在方法声明中,在指定参数类型后加一个省略号(...). 一个方法中只能指定一个可变参数,它必须是方法的最后一个参数 ...

  5. oracle 数据库备份脚本(数据泵1-全库)

    #!/bin/sh# ################################################################### Powered by Ironfo# ## ...

  6. 杭电oj 求奇数的乘积

    #include <stdio.h> #include <stdlib.h> int main() { int i,n,a; int sum = 1; while(scanf( ...

  7. lui - pager - 分页

    pager - 分页 demo lui demo <template> <div class="app-container"> <h3>el-p ...

  8. vue.js与webpack有什么关系?

    webpack是一个前端打包和构建工具.如果你之前一直是手写HTML,CSS,Javascript并且通过link标签将CSS引入你的HTML文件,以及通过Script标签的src属性引入外部的JS脚 ...

  9. SQL-运算

    dual表可以进行运算select * from dual; 算数运算 + - * /select 5 + 6 as aaa ,6 - 3 as bbb ,5 * 7 as ccc ,9/2 as d ...

  10. bzoj 4573

    LCT神题... 首先暴力的做法就是每次在一个区间上link,然后暴力查询,时间复杂度$O(爆炸)$ 但是我们可以发现的是,每棵树之间互不影响! 因此我们可以考虑离线之后分别统计每棵树 但是这样做其实 ...