软硬链接-动静态编译
来源:互联网 发布:日本对华援助知乎 编辑:程序博客网 时间:2024/05/17 10:54
1、硬链接与软链接
简单的说,软链接就是windows中的快捷方式,删除软链接后,源文件不会消失;删除源文件后,软链接会无效。
硬链接好比指针,创建一个与原始文件相同的文件,并跟随源文件同步,修改任何一个文件都会同步修改。
摘抄举例:
[oracle@Linux]$ touch f1 #创建一个测试文件f1
[oracle@Linux]$ ln f1 f2 #创建f1的一个硬连接文件f2
[oracle@Linux]$ ln -s f1 f3 #创建f1的一个符号连接文件f3
[oracle@Linux]$ ls -li # -i参数显示文件的inode节点信息
total 0
9797648 -rw-r--r-- 2 oracle oinstall 0 Apr 21 08:11 f1
9797648 -rw-r--r-- 2 oracle oinstall 0 Apr 21 08:11 f2
9797649 lrwxrwxrwx 1 oracle oinstall 2 Apr 21 08:11 f3 -> f1
从上面的结果中可以看出,硬连接文件f2与原文件f1的inode节点相同,均为9797648,然而符号连接文件的inode节点不同。
[oracle@Linux]$ echo "I am f1 file" >>f1
[oracle@Linux]$ cat f1
I am f1 file
[oracle@Linux]$ cat f2
I am f1 file
[oracle@Linux]$ cat f3
I am f1 file
[oracle@Linux]$ rm -f f1
[oracle@Linux]$ cat f2
I am f1 file
[oracle@Linux]$ cat f3
cat: f3: No such file or directory
通过上面的测试可以看出:当删除原始文件f1后,硬连接f2不受影响,但是符号连接f1文件无效
2、动态编译与静态编译
静态程序库会有类似libname.a
这样的名称;而共享程序库则称为libname.so .x.y.z
,此处的x.y.z
是指版本序号的样式。使用ldd命令可以查看动态库。
静态编译:将所有的库和主程序都编译到一个主程序里面。优点是不依赖其他,拿到即可执行;缺点是,需要升级是必须全部编译,文件占用空间大。占内存,如果有多个(调用相同库函数的)进程在内存中同时运行,内存中就存有多份相同的库函数代码,因此占用内存空间较多!
ar rcs my_library.a file1.o file2.o
动态编译:库与主程序分离,执行时需要依赖库的存在。优点是,升级只需升级库即可,可以多个程序共享库,占用空间小;就算有几个程序同时运行,内存也只存在一份函数代码;
linux下文件的类型是不依赖于其后缀名的,但一般来讲:
静态:lib;动态:dll,.so;
.o,是目标文件,相当于windows中的.obj文件
.so 为共享库,是shared object,用于动态连接的,和dll差不多
.a为静态库,是好多个.o合在一起,用于静态连接
*************************************************************************************************************************************************
以下摘抄举例:
(1)动态库的编译
下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so。
so_test.h:
#include <stdio.h>
#include <stdlib.h>
void test_a();
void test_b();
void test_c();
test_a.c:
#include "so_test.h"
void test_a()
{
}
test_b.c:
#include "so_test.h"
void test_b()
{
}
test_c.c:
#include "so_test.h"
void test_c()
{
}
将这几个文件编译成一个动态库:libtest.so
$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so
(2)动态库的链接
在(1)中,我们已经成功生成了一个自己的动态链接库libtest.so,下面我们通过一个程序来调用这个库里的函数。程序的源文件为:test.c。
test.c:
#include "so_test.h"
int main()
{
}
$ gcc test.c -L. -ltest -o test
$ ldd test
最主要的是GCC命令行的一个选项:
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
(4)注意
makefile里面怎么正确的编译和连接生成.so库文件,然后又是在其他程序的makefile里面如何编译和连接才能调用这个库文件的函数????
答:
LD_LIBRARY_PATH可以在/etc/profile还是 ~/.profile还是 ./bash_profile里设置,或者.bashrc里,改完后运行source /etc/profile或 . /etc/profile;
更好的办法是添入/etc/ld.so.conf, 然后执行 /sbin/ldconfig
CFLAGS=-Wall
#CFLAGS=
all:
libfunc:func.o
***********************************************注释************************************************
ln -s是用来创建软链接,也就相当于windows中的快捷方式,在当前目录中创建上一级目录中的文件ttt的命名为ttt2软链接的命令是ln -s ../ttt ttt2,如果原文件也就是ttt文件删除的话,ttt2也变成了空文件。
ln -d是用来创建硬链接,也就相当于windows中文件的副本,当原文件删除的时候,并不影响“副本”的内容。
编译目标文件时使用gcc的-fPIC选项,产生与位置无关的代码并能被加载到任何地址:
gcc –fPIC –g –c liberr.c –o liberr.o
使用gcc的-shared和-soname选项;
使用gcc的-Wl选项把参数传递给连接器ld;
使用gcc的-l选项显示的连接C库,以保证可以得到所需的启动(startup)代码,从而避免程序在使用不同的,可能不兼容版本的C库的系统上不能启动执行。
gcc –g –shared –Wl,-soname,liberr.so –o liberr.so.1.0.0 liberr.o –lc
建立相应的符号连接:
ln –s liberr.so.1.0.0 liberr.so.1;
ln –s liberr.so.1.0.0 liberr.so;
在MAKEFILE中:
$@
$%
$<
$?
$^
test:
%.o:%.c
clean:
要生成.so文件,cc要带-shared
- 软硬链接-动静态编译
- 编译链接和动静态库
- 编译链接和动静态库
- Linux 下编译链接动静态库
- 动静态链接
- 动静态库及动静态链接
- 软硬链接
- 软硬链接
- 动静态链接库解析
- 动、静态库编译顺序
- linux编译动静态库
- VS2008的动、静态编译
- VS2008的动、静态编译
- VS2008的动、静态编译
- 编译过程、动静态库
- Linux 软硬链接对比
- Linux 软硬链接对比
- cp & 软硬链接
- 内核线程、轻量级进程、用户线程、用户进程
- 公布2012年5月赛CSDN算法达人赛试题及参考答案
- [原]opencv学习之QT,Mat 2 QImage
- 字节顺序
- Excel资金日报表中根据借贷方向计算余额以及引用函数的巧妙运用
- 软硬链接-动静态编译
- 北大ACM推荐题目
- C#获取Excel中所有的Sheet名称
- Div+Css技能积累
- 1002. 交通工具
- 第十六周实验--任务2--学生成绩排序--从已有的文件中读入学生数据并把修改后的数据写入到另一个新创建的文件中
- 玩转C链表
- CouchDB的客户端用法1:Java客户端
- #pragma 的使用