linux gcc 制作动态库

  1. 编译与位置无关的代码,生成.o,关键参数 -fPIC
createlibso目录下
├── cheng.c
├── chu.c
├── head
│   └── test.h
├── jia.c
└── jian.c
gcc -fPIC -c *.c -I ./head

在createlibso目录下生成 与位置无关的.o文件

├── cheng.c
├── cheng.o
├── chu.c
├── chu.o
├── head
│   └── test.h
├── jia.c
├── jian.c
├── jian.o
└── jia.o
  1. 将.o文件打包, 关键参数 -shared
gcc -shared *.o -o libjjcc.so

生成 动态库 libjjcc.so动态库文件

  1. 将库文件与头文件一起发布
在testlibso目录下
├── head
│   └── test.h
├── lib
│   └── libjjcc.so
└── main.c
  1. 编译出可执行程序(按照视频教程来, 等再按照另一方法)
gcc main.c -L ./lib -l jjcc -I ./head -o useSOapp 
  1. 解决不能加载动态库的的问题
a. 拷贝到 /lib 目录下,或者在/lib目录下建立so文件的链接(不推荐)
b. 将库路径增加到环境变量 LD_LIBRARY_PATH中(不推荐, 且是一次性的,退出当前终端就不生效了,要想一直有效,要修改 ~/.bashrc 里面的内容 ,就是将exprot..追加进去)
比如课程中是这样的, 图下所示,是以追加的形式修改环境变量的

在这里插入图片描述

c. 配置 /etc/ld.so.conf文件,增加 库路径,并执行 sudo ldconfig -v

在这里插入图片描述

动态库内存使用模型

在这里插入图片描述

PS:
1、LIBRARY_PATH:环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径.

指定gcc编译需要链接动态链接库的目录。设置libtest1和libtest2目录
# export LIBRARY_PATH=libtest1:libtest2:$LIBRARY_PATH //或写入:/etc/profile配置文件中# gcc *.c -L./libtest1 -L./libtest2 -ltest1 -ltest2 //编译时分别链接libtest1目录下的libtest1.so库与libtest2目录的libtest2.so库。

2、LD_LIBRARY_PATH:环境变量用于在程序运行期间查找动态链接库时指定除了系统默认路径(/usr/lib)之外的路径.
可执行文件运行程序之前执行:

# export LD_LIBRARY_PATH=libtest1:libtest2:$LD_LIBRARY_PATH  //或写入:/etc/profile配置文件中# ./program //运行可执行程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu的中文是哪种字体?python的词云分析和 三国演义人物出场统计

Ubuntu的默认中文是哪种呢? fc-list :langzh 用这个命令查看出来 NotoSerifCJK-Bold.ttc 为什么要知道这个呢? 来看一块python3代码 import jieba import wordcloudf open("threekingdom.txt","rb") t f.read() f.close() ls …

linux 系统课程-进程控制01

进程的状态转化 进程拥有四种状态(切换),他们之间的关系如图 运行 挂起 终止 就绪内存管理单元 MMU (Memory Management Unit) mmu 负责 a. 虚拟内存与物理内存的映射 b. 设置内存的访问级别 pcb 进程控制块 环…

linux c++ 多进程初步01

fork函数 fork函数 ps ajx 这个命令可以查看进程与进程之间的血缘关系 kill 给进程发送一个信号SIGKILL 9号信号kill -SIGKILL pik 杀死进程进程共享 子进程会复制父进程的几乎所有信息:子进程复制父进程用户空间所有数据; 子进程复制父进程内核空间P…

Ubuntu怎么设置桌面快捷方式(图片详解)

然后找到你要的copy然后到桌面,点开然后允许权限!就搞定了

linux C++ 多进程初步02

ps:疑惑的地方,1 进程pcb的概念, 还有 ulimit -a 显示的信息 是一个进程可以最大占用资源的上限吗? 还有 文件描述符的概念?? 这里不是很明白!记录一下2还有WIFEXITED 孤儿进程 与僵尸进程 孤儿进程&#…

Linux C语言C++ makefile文件编写

ps: 这里 不是很明白&#xff1f;尤其是 后面 三个变量&#xff0c;什么区别&#xff1f; $ 代表目标 $^ 代表全部依赖 $< 第一个依赖 $? 第一个变化的依赖 makefile makefile 命名规则makefileMakefilemakefile 三要素目标依赖规则命令 写法&#xff1a; 目标:依赖 tab键…

Ubuntu升级

apt-get update: 升级安装包相关的命令,刷新可安装的软件列表(但是不做任何实际的安装动作) apt-get upgrade: 进行安装包的更新(软件版本的升级) apt-get dist-upgrade: 进行系统版本的升级(Ubuntu版本的升级) do-release-upgrade: Ubuntu官方推荐的系统升级方式,若加参数-…

软件工程学习笔记《一》什么是软件工程

文章目录软件工程学习笔记目录软件工程过程软件工程方法软件质量软件质量如何评价软件的质量模型ISO9126模型易用性&#xff1a;效率可维护性可移植性为什么内存缓冲区是2048或4096软件工程学习笔记目录 [https://blog.csdn.net/csdn_kou/article/details/83754356] 单纯摆出一…

linux C语言 文件相关知识01

ps:文件描述符表&#xff0c;与文件指针 有什么联系&#xff1f;&#xff1f;&#xff1f; 1. linux 系统&#xff0c;一般一个进程 允许打开的最大文件数量是 1024&#xff0c; 对应内核区的进程控制块&#xff08;pcb&#xff09;中的文件描述符表的范围&#xff0c; 在shell…

linux 系统函数调用:open close read write lseek

open函数 查看函数原型 man 2 open #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);相关参数用法介绍&#xff1b; a. pathname …

PyCharm安装和配置教程

文章目录官网链接错误类型&#xff01;1.你的用户名是中文解决方案PyCharm的汉化和配置PyCharm的简单使用入门PyCharm和git安装教程官网链接 www.jetbrains.com 错误类型&#xff01;1.你的用户名是中文 安装第一次各种问题&#xff01;就不多了&#xff0c;反正各种报错 原…

linux 进程通信 pipe

pipe函数 管道函数 man pipe #include <unistd.h> int pipe(int pipefd[2]);参数介绍&#xff1a;pipefd读写文件描述符&#xff0c;0-代表读&#xff0c; 1-代表写父子进程实现pipe通信&#xff0c;实现ps aux | grep bash 功能 经常出现的问题&#xff1a; 父进程认为…

软件工程学习笔记《二》代码规范

文章目录软件工程学习笔记目录google代码规范节选python来自google翻译错误注释的示例命名规范import语句的规范import this 源码软件工程学习笔记目录 [https://blog.csdn.net/csdn_kou/article/details/83754356] google代码规范 https://github.com/google/styleguide 节…

Linux 进程通信之FIFO

FIFO通信&#xff08;first in first out&#xff09; FIFO 有名管道&#xff0c;实现无血缘关系进程通信。 ----创建一个管道的伪文件 a.mkfifo testfifo 命令创建 b.也可以使用函数int mkfifo(const char *pathname, mode_t mode); ----内核会针对fifo文件开辟一个缓冲区&…

PyCharm和git安装教程

文章目录先到官网下载git进入setting&#xff0c;如黄色部分如果你用的是github那么直接setting登陆就行了如果你是gitee的话首先进入setting然后Plugins点击browse查找gitee如图所示&#xff01;最后点击重启ok《不要自己关闭&#xff0c;否则安装失败》安装好了以后,输入你的…

linux 进程通信子mmap

mmap 文件–内存映射 函数原型 #include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);参数介绍&#xff1a; add 传 NULL length 映射区的长度 protPROT_READ 可读PROT_WRITE可写 flagsMAP_SHARED 共享的&#xff0c…

malloc和calloc的区别

是否对申请的区域进行初始化而已 但是我想你也知道我们写程序的时候多用malloc而很少用calloc&#xff0c;何解&#xff1f; 因为calloc虽然对内存进行了初始化&#xff08;全部初始化为0&#xff09;&#xff0c;但是同样也要降低效率的 calloc相当于 p malloc(); memset(p,…

linux信号学习02

未决信号集与阻塞信号集(信号屏蔽字) 阻塞信号集&#xff1a; 将某些信号加入集合&#xff0c;对他们设置屏蔽&#xff0c;当屏蔽x信号后&#xff0c;再收到该信号&#xff0c;该信号的处理将推后(解除屏蔽后) 未决信号集&#xff1a; a. 信号产生&#xff0c;未决信号集中描述…

task_struct 结构如何查看及分析

cd /find -name sched.hvim usr/src/kernels/3.10.0862.6.3.el7.x86_64/include/linux/sched.hhttps://www.cnblogs.com/zxc2man/p/6649771.html 进程是处于执行期的程序以及它所管理的资源&#xff08;如打开的文件、挂起的信号、进程状态、地址空间等等&#xff09;的总称。…