文档章节

linux下 编译为动态链接库

NiuYoohoo
 NiuYoohoo
发布于 2017/05/21 17:00
字数 552
阅读 69
收藏 0

假如我想把以下的代码编译为动态库

/*code.c*/
#include <stdio.h>

void out()
{
	printf("::I am a dynamic library");
}

编译生产动态库

gcc code.c -fPIC -shared -o libcode.so
  • -fPIC  (Position-Independent Code)作用于编译阶段,在编译动态库时(.so文件)告诉编译器产生与位置无关代码。若未指定-fPIC选项编译.so文件,则在加载动态库时需进行重定向。对于我们的32位环境来说, 编译时是否加上-fPIC, 都不会对链接产生影响, 只是一份代码的在内存中有几个副本的问题(而且对于静态库而言结果都是一样的)。但在64位的环境下装载时重定位的方式存在一个问题,就是在我们的64位环境下用来进行位置偏移定位的。cpu指令只支持32位的偏移, 但实际中位置的偏移是完全可能超过64位的,所以在这种情况下编译器要求用户必须采用fPIC的方式进行编译的程序才可以在共享库中使用。
  • -shared 编译为共享库。
  • 输出库文件必须为lib+名字+.so

在代码中直接调用动态库接口

/*app.c*/
#include <stdio.h>

void out();

int  main()
{

printf("call library==>");
	out();
return 0;
}

调用动态库编译出可执行文件

gcc app.c -lcode -L. -o app
  • -l+库名(去除开头的lib)指明库的名称。
  • -L+库所在目录 (.表示当前目录)

运行载有动态库的程序

#如果直接运行
./app
./app: error while loading shared libraries: libcode.so: 
cannot open shared object file: No such file or directory
#出错了提示无法打开目标文件,这是因为动态库程序加载时会在LD_LIBRARY_PATH这个环境变量包含目录中去找加载的库,
#如果你当前编译的目录不是包含在这个环境变量中,那么就会产生这个错误。当然解决办法就是把当前编译的库目录包含到
#LD_LIBRARY_PATH中可以通过修改配置文件或者命令行的方式。
#如命令行方式 export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
#再次执行
./app
call library==>::I am a dynamic library

 

© 著作权归作者所有

共有 人打赏支持
NiuYoohoo
粉丝 1
博文 49
码字总数 18987
作品 0
赣州
[动态库]深入分析Windows和Linux动态库应用异同

摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理。 ...

龙宝宝
2011/08/05
0
0
LD_PRELOAD替换进程底层函数

LD_PRELOAD是什么 LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。这个功能主要就是用来有选择性的...

超级大黑猫
05/16
0
0
Linux GCC编译使用动态、静态链接库

在windows下动态链接库是以.dll后缀的文件,二在Linux中,是以.so作后缀的文件。 动态链接库的好处就是节省内存空间。 1、Linux下创建动态链接库 在使用GCC编译程序时,只需加上-shared选项即...

rivsidn
05/09
0
0
linux 静态库的生成与使用

库是一种软件组件技术,库里面封装了数据和函数。 库的使用可以使程序模块化。 Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件)。 Linux通常把库文件存放在/usr/lib或/lib目...

markqk
2014/02/12
0
0
linux 下动态链接库的制作与使用

linux 下动态链接库的制作与使用 linux 下动态链接库的制作与使用 动态链接库.so的编译与使用- - 动态库.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链...

李东委
2014/10/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

秒杀网站系统设计详解

最近总有一些朋友问高并发问题,后来就想自己把一个秒杀系统作为例子详细分解一下,也是一个学习过程。 首先假设场景,预计该活动可能有1万人参加,那最大并发数为1万。 主要面对的问题分析:...

小海bug
15分钟前
0
0
TypeScript基础入门之装饰器(一)

转发 TypeScript基础入门之装饰器(一) 介绍 随着TypeScript和ES6中Classes的引入,现在存在某些场景需要额外的功能来支持注释或修改类和类成员。 装饰器提供了一种为类声明和成员添加注释和元...

durban
25分钟前
0
0
sed命令扩展使用操作

打印某行到某行之间的内容 假若文件test.txt的内容是: ertfff**[abcfd]123324444[rty]**fgfgf 怎么能截取 [abcfd]123324444[rty] 这一部分出来呢? 操作命令: 知道开始行和结...

野雪球
41分钟前
1
0
JVM内存笔记

Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓 冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。 Java 线程结束,原...

凌渡
47分钟前
1
0
284. Peeking Iterator

Description Tag: Design Difficulties: Medium Given an Iterator class interface with methods: next() and hasNext(), design and implement a PeekingIterator that support the pee......

52iSilence7
49分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部