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 孤儿进程 与僵尸进程 孤儿进程&#…

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

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

linux C语言 文件相关知识01

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

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

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

PyCharm和git安装教程

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

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…

linux信号学习02

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

软件工程学习笔记《三》代码优化和性能测试

文章目录软件工程学习笔记目录如何在开源社区提问&#xff1f;代码审查代码优化运行结果参数解释代码优化原则对常见的数据结构排序算法进行测试关于冒泡排序优化的探讨结果软件工程学习笔记目录 [https://blog.csdn.net/csdn_kou/article/details/83754356] 如何在开源社区提…

linux信号捕捉

信号捕捉&#xff0c;防止进程意外死亡 signal函数 man signal #include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);参数介绍&#xff1b; signum 要捕捉的信号 handler 要执行的捕捉函数指针&#xff0c…

软件工程学习笔记《四》需求分析

文章目录软件工程学习笔记《目录》需求工程师当代的需求工程师需要具备的能力当代的需求工程师需要努力的方向当代的需求工程师需要注意的错误需求的定义需求目标需求分析的实质需求分析的关键应该涵盖的内容&#xff1f;需求规约&#xff08;作为较客观的参照&#xff09;单个…

linux守护进程

先了解 linux系统中 会话的概念 会话是进程组的更高一级&#xff0c;多个进程组对应一个会话。 会话是一个或多个进程组的集合 创建一个会话需要注意以下5点事项&#xff1a; a. 调用进程不能是进程组组长&#xff0c; 该进程变成新会话首进程&#xff08;session header&#…

linux 线程学习初步01

线程的概念 进程与线程内核实现 通过函数clone实现的 ps -Lf pidLinux内核线程实现原理 同一个进程下的线程&#xff0c;共享该进程的内存区&#xff0c; 但是只有stack区域不共享。 线程共享资源 a.文件描述符表 b.每种信号的处理方式 c.当前工作目录 d.用户id和组id 线程…

python的文件基本操作和文件指针

读写模式的基本操作 https://www.cnblogs.com/c-x-m/articles/7756498.html r,w,a r只读模式【默认模式&#xff0c;文件必须存在&#xff0c;不存在则抛出异常】w只写模式【不可读&#xff1b;不存在则创建&#xff1b;存在则清空内容】a之追加写模式【不可读&#xff1b;不…

HTTP菜鸟教程速查手册

HTTP协议&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是因特网上应用最为广泛的一种网络传输协议&#xff0c;所有的WWW文件都必须遵守这个标准。 HTTP是一个基于TCP/IP通信协议来传递数据&#xff08;HTML 文件, 图片文件, 查询结果等&am…

mysql学习笔记01-创建数据库

创建数据库&#xff1a; 校验规则&#xff1a;是指表的排序规则和查询时候的规则 utf8_general_ci 支持中文&#xff0c; 且不区分大小写 utf8_bin 支持中文&#xff0c; 区分大小写 比如&#xff1a; create database db3 character set utf8 collate utf8_general_ci; &…

python的Web编程

首先看一下效果 完整代码 import socket from multiprocessing import ProcessHTML_ROOT_DIR ""def handle_client(client_socket):request_data client_socket.recv(1024)print("request data:", request_data)response_start_line "HTTP/1.0 20…