共享库的使用(.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. C#中的ReferenceEquals、Equals以及==

    https://www.cnblogs.com/ArtofDesign/p/3615212.html   C#中有一共有四种相等性判断方法: //Object中定义的三个方法 public stati ...

  2. 尝试在Ubuntu中安装Emacs遇到的问题

    出现具体问题 今日学习安装emacs在Ubuntu19.04当中 安装详见下方帖子: 链接: 如何在Ubuntu中安装Emacs. 安装遇到问题,即 sudo add-apt-repository p ...

  3. 假设页面左侧有一个列表,点击列表某一项时,将根据当前id发起一个请求,并将响应结果展示在右侧。如果快速多次点击不同列表项,当网络不稳定时,请求返回的顺序与我点击顺序不符,导致展示的结果不是我最后一次点击的对应结果,怎么办?

    1.防抖/节流方案 ,不可完全避免,请求数据时间不一致2.如果使用ajax/axios,发起请求时可直接取消上一次未完成的请求可实现3.临时记录最后一次的id,要求服务器返回时携带id,对比选择后渲染 ...

  4. JS学习-Promise

    Promise 一个 Promise 必然处于以下几种状态之一: 待定(pending): 初始状态,既没有被兑现,也没有被拒绝. 已兑现(fulfilled): 意味着操作成功完成. 已拒绝(rej ...

  5. [jQuery]z-index属性大于0的元素使用fadeIn无法正常过渡的问题

    rt 问题记录. 尝试使用$('    ').animate({ opacity: 1 }) 会出现相同的问题. 可能是opacity动画与z-index无法兼容(?) 最后的处理方式是改变元素渲染顺 ...

  6. 语言-页面-模板-thymeleaf

    一.语法 二.使用 Thymeleaf入门到吃灰 - 鞋破露脚尖儿 - 博客园 (cnblogs.com)

  7. tomcat各个版本下载

    官网地址:https://archive.apache.org/dist/tomcat/

  8. 项目脚手架之webpack

      分享版本: webpackV4.X (企企项目PC端-webpack: 4.29.6.webpack-cli: 3.1.1) 分享初衷: 本文我们结合企企项目(下面相关代码片段主要取至我们项目) ...

  9. 不用画的动画——ShaderCp11

    --20.9.14 Shader中主要有及两种动画,一种就是纹理动画还有一种就是顶点动画. 动画效果一般都需要把时间加入一些变量的计算,以便画面可以随时间发生变化.下面是Shader中的如何去访问时间 ...

  10. Vue RSA加密

    1. 安装jsencrypt npm install jsencrypt 2. 引入jsencrypt // 全局引入 import JSEncrypt from "jsencrypt&qu ...