Linux库函数制作(静态库、动态库)
Linux库函数制作(静态库、动态库)
静态库与动态库
链接方式
链接分为两种:静态链接、动态链接
静态链接:
由链接器在链接时将库的内容加入到可执行程序中
静态链接的特点是:
优点:
对运行环境的依赖性较小,具有较好的兼容性
缺点:
生成的程序比较大,需要更多的系统资源,在装入内存时会消耗更多的时间
库函数有了更新,必须重新编译应用程序
动态链接:
连接器在链接时仅仅建立与所需库函数的之间的链接关系,在程序运行时才将所需资源调入可执行程序
动态链接的特点:
优点:
在需要的时候才会调入对应的资源函数
简化程序的升级;有着较小的程序体积
实现进程之间的资源共享(避免重复拷贝)
缺点:
依赖动态库,不能独立运行
动态库依赖版本问题严重
/*************************************************************************
> File Name: myprintf.c
> Author: lsgxeva
> Mail: lsgxeva@163.com
> Created Time: 2017年09月28日 星期四 11时52分57秒
************************************************************************/
#include <stdio.h>
void myprintf(void)
{
printf("hello, world!\n");
}
/*************************************************************************
> File Name: myprintf.h
> Author: lsgxeva
> Mail: lsgxeva@163.com
> Created Time: 2017年09月28日 星期四 11时53分15秒
************************************************************************/
#ifndef _MYPRINTF_H_
#define _MYPRINTF_H_
extern void myprintf(void);
#endif // _MYPRINTF_H_
/*************************************************************************
> File Name: mytest.c
> Author: lsgxeva
> Mail: lsgxeva@163.com
> Created Time: 2017年09月28日 星期四 11时54分26秒
************************************************************************/
#include "myprintf.h"
int main()
{
myprintf();
return 0;
}
目录结构
drwxr-xr-x 5 root root 94 9月 28 12:22 .
drwxr-xr-x 5 root root 54 9月 28 11:08 ..
-rw-r--r-- 1 root root 360 9月 28 11:53 myprintf.c
-rw-r--r-- 1 root root 380 9月 28 11:54 myprintf.h
-rw-r--r-- 1 root root 351 9月 28 12:22 mytest.c
drwxr-xr-x 2 root root 6 9月 28 12:24 output
drwxr-xr-x 2 root root 6 9月 28 11:56 shared
drwxr-xr-x 2 root root 6 9月 28 12:23 static
制作静态链接库



制作动态链接库


解决无法打开动态库的常用简便方法:
声明临时变量环境
export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH
或者修改 /etc/ld.so.conf 文件 在其中添加库的搜索路径,一行一个路径。
sudo ldconfig 更新 /etc/ld.so.cache 文件
那 ./etc/ld.so.conf 中所有路径的库文件都被缓存达到 /etc/ld.so.cache 中。

注意: 将生成共享库的编译参数-shared错误地用于生成可执行文件,将导致程序运行时发生段错误!
编译产生动态链接库,并支持 major 和 minor 版本号。


动态链接和静态链接时,可执行文件的区别:

Linux共享对象之编译参数fPIC
g++ -fPIC -shared test.cc -o lib.so
g++ -fPIC test.cpp -c -o test.o
ld -shared test.o -o lib.so
/usr/bin/ld: test.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
test.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
readelf -d foo.so |grep TEXTREL
readelf -r Lib.so
Linux库函数制作(静态库、动态库)的更多相关文章
- linux静态与动态库创建及使用实例
一,gcc基础语法: 基本语法结构:(由以下四部分组成) gcc -o 可执行文件名 依赖文件集(*.c/*.o) 依赖库文件及其头文件集(由-I或-L与-l指明) gcc 依赖文件集(*.c/*.o ...
- Linux 静态库&动态库调用
1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...
- Windows 下VC++6.0制作、使用动态库和静态库
Windows 下VC++6.0制作.使用动态库和静态库 一.VC++6.0制作.使用静态库 静态库制作 1.如图一在VC++6.0中new一个的为win32 static library工程并新建一 ...
- Linux中创建和使用静态库&动态库
库本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行 Linux下库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在 ...
- C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项
目录 . 引言 . 交叉编译 . Cygwin简介 . 静态库编译及使用 . 动态库编译及使用 . MinGW简介 . CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件 ...
- 静态库&动态库&导入库
我遇到的问题 先贴一个StackOverflow上的问题 上面的问题让我知道了更多动态库的知识. 我需要使用一个声音库(irrKlang)为2d游戏提供声音,我使用的编译器是mingw-w64,但是i ...
- 静态库动态库的编译、链接, binutils工具集, 代码段\数据段\bss段解释
#1. 如何使用静态库 制作静态库 (1)gcc *.c -c -I../include得到o文件 (2) ar rcs libMyTest.a *.o 将所有.o文件打包为静态库,r将文件插入静态库 ...
- 生成lua的静态库.动态库.lua.exe和luac.exe
前些日子准备学习下关于lua coroutine更为强大的功能,然而发现根据lua 5.1.4版本来运行一段代码的话也会导致 "lua: attempt to yield across me ...
- windows库的创建和使用:静态库+动态库
windows库的创建和使用:静态库+动态库 一.静态库的创建和使用 1. 静态库创建 (1)首先创建projecttest,測试代码例如以下: 1) test.h void test_print ...
随机推荐
- IE无法获得cookie,ie不支持cookie的解决办法,火狐支持
发现用自己的电脑 IE7.0总是无法正常登录,别的电脑都可以. 每次登录后又被重定向回了登录页面. 可换成Firefox和google chrome 却一切OK,后来还把浏览器升级到IE8.0 问题依 ...
- Java IO使用入门
总体结构 IO应该是平时项目里最常用到的功能了,无论是简单的文件读取,还是服务器端口监听,都会用到IO:但是,在面对Java IO包里庞杂的IO基础类库时,经常会很头大,是该选择InputStream ...
- TCO之旅
TCO之旅 时间限制: 1 Sec 内存限制: 128 MB提交: 77 解决: 24[提交][状态][讨论版] 题目描述 我们的小强终于实现了他TCO的梦想了,爬进了TCO的全球总决赛,开始了他 ...
- 无向图广度优先遍历及其matlab实现
广度优先遍历(breadth-first traverse,bfts),称作广度优先搜索(breath first search)是连通图的一种遍历策略.之所以称作广度优先遍历是因为他的思想是从一个顶 ...
- Codeforces Round #420 (Div. 2)
/*************************************************************************************************** ...
- IOC模式理解
理解IOC inversion of control 控制反转 与 DI Dependency Injection 依赖注入概念之前,我们需要知道在一个系统的设计过程中,降低各模块之间的相 ...
- ubuntu中使用usb-creator制作live usb
1.实验环境 ubuntu14.04 2.启动usb-creator 2.1 单击桌面左上角的搜索图标,输入usb-creator,然后选择“应用程序"中的”启动盘创建器“ 2.2 终端中输 ...
- JS在可编辑的div中的光标位置插入内容或表情
<input type="button" value="插入字符" onclick="document.getElementById('test ...
- Jquery地图热点效果-鼠标经过弹出提示信息
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- KMP算法实践与简单分析
一.理解next数组 1.约定next[0]=-1,同时可以假想在sub串的最前面有一个通配符"*",能够任意匹配.对应实际的代码t<0时的处理情况. 2.next[j]可以 ...